1

次のような LINQ クエリがあります。

from a in _context.tblTradeSpends
orderby a.DealPeriod, a.CustomerNumber, a.LOB, a.VersionDate descending
select new
{
  DealPeriod = a.DealPeriod,
  CustomerNumber = a.CustomerNumber,
  LOB = a.LOB,
  PromoID = a.PromoID,
  VersionDate = a.VersionDate
}

これが私の結果セットからの小さなサンプルです (書式設定については申し訳ありません):

DealPeriod  CustomerNumber   LOB    PromoID     VersionDate

2013        10001            PL     P0083312    12/04/2013 9:05
2013        10001            PL     P0083313    12/04/2013 9:05
2013        10001            PL     P0083314    12/04/2013 9:05
2013        10001            PL     P0085100    12/04/2013 9:05
2013        10001            PL     P0086169    12/04/2013 9:05
2013        10001            PL     P0083312    18/01/2013 10:51
2013        10001            PL     P0083313    18/01/2013 10:51
2013        10001            PL     P0083314    18/01/2013 10:51
2013        10001            PL     P0085100    18/01/2013 10:51
2013        10001            PL     P0083312    07/07/2013 15:41
2013        10001            PL     P0083313    07/07/2013 15:41
2013        10001            PL     P0083314    07/07/2013 15:41
2013        10001            SCF    P0083308    03/05/2013 11:27
2013        10001            SCF    P0083309    03/05/2013 11:27
2013        10001            SCF    P0085088    03/05/2013 11:27
2013        10001            SCF    P0085380    03/05/2013 11:27
2013        10001            SCF    P0085381    03/05/2013 11:27
2013        10213            SCF    P0086880    11/07/2013 20:23
2013        10213            SCF    P0086881    11/07/2013 20:23
2013        10213            SCF    P0086882    11/07/2013 20:23
2013        10213            SCF    P0086883    11/07/2013 20:23
2013        10213            SCF    P0083630    28/05/2013 13:38
2013        10213            SCF    P0083631    28/05/2013 13:38
2013        10213            SCF    P0083632    28/05/2013 13:38
2013        10213            SCF    P0083633    28/05/2013 13:38

このデータを分析する必要があるため、特定の関連レコードを削除して、データを削減することを検討しています。私のルールは、2013 年 1 月 6 日 (2013 年 6 月 1 日) を過ぎたバージョン日付を持たない、同じ取引期間、顧客番号、および LOB フィールドを持つすべてのレコードを削除することです。

2013|10001|PLしたがって、私の結果セットでは、一部のレコードのバージョン日付が 07/17/2013 であるため、すべてのレコードを最初から保持したいと思います。

2013|10001|SCFこれらのフィールド値を持つレコードのバージョン日付が 2013 年 1 月 6 日を過ぎているため、で始まるレコードを削除します。

2013|10213|SCFこれらのレコードの一部のバージョン日付は 11/07/2013 であるため、最初からレコードを保持したいと思います。

編集

King King のコードを試してみたところ、そこにあるはずのない関連レコードがいくつか得られました。除外されたはずの 2 つのグループを次に示します。

2013    10039   SCF P0083145    05/02/2013 10:22
2013    10039   SCF P0083146    05/02/2013 10:22
2013    10039   SCF P0083147    05/02/2013 10:22
2013    10039   SCF P0085152    05/02/2013 10:22
2013    10039   SCF P0083145    1/22/2013 5:55:00 PM
2013    10039   SCF P0083146    1/22/2013 5:55:00 PM
2013    10039   SCF P0083147    1/22/2013 5:55:00 PM
2013    10039   SCF P0085152    1/22/2013 5:55:00 PM
2013    10039   SCF P0083145    12/05/2012 19:21
2013    10039   SCF P0083146    12/05/2012 19:21
2013    10039   SCF P0083147    12/05/2012 19:21
2013    10040   PL  P0084345    1/14/2013 10:27:00 AM
2013    10040   PL  P0084346    1/14/2013 10:27:00 AM
2013    10040   PL  P0084347    1/14/2013 10:27:00 AM
2013    10040   PL  P0084348    1/14/2013 10:27:00 AM
2013    10040   PL  P0084345    12/20/2012 10:15:00 PM
2013    10040   PL  P0084346    12/20/2012 10:15:00 PM
2013    10040   PL  P0084347    12/20/2012 10:15:00 PM
2013    10040   PL  P0084348    12/20/2012 10:15:00 PM
4

3 に答える 3

0

まず、匿名型のジェネリック比較子を作成する必要があります。

public class MyEqualityComparer<T> : IEqualityComparer<T>
{
    Func<T, T, bool> _equalsFunction;
    Func<T, int> _hashCodeFunction;

    public MyEqualityComparer(
        Func<T, T, bool> equalsFunction, Func<T, int> hashCodeFunction)
    {
        if (equalsFunction == null) throw new ArgumentNullException();
        if (hashCodeFunction == null) throw new ArgumentNullException();

        _equalsFunction = equalsFunction;
        _hashCodeFunction = hashCodeFunction;
    }

    public bool Equals(T x, T y)
    {
        return _equalsFunction(x, y);
    }

    public int GetHashCode(T obj)
    {
        return _hashCodeFunction(obj);
    }
}

次に、次のクエリを使用します。

var comp = new MyEqualityComparer<tblTradeSpend>(
            (x, y) => x.DealPeriod == y.DealPeriod && 
                x.CustomerNumber == y.CustomerNumber && 
                x.LOB == y.LOB, 
            obj => obj.DealPeriod.GetHashCode() ^ 
                 obj.CustomerNumber.GetHashCode() ^ 
                 obj.LOB.GetHashCode()
        );    

var q = (from a in _context.tblTradeSpends.AsEnumerable()
    where a.VersionDate < DateTime.Parse("6/1/2013")        
    select new
    {
        DealPeriod = a.DealPeriod,
        CustomerNumber = a.CustomerNumber,
        LOB = a.LOB,
        PromoID = a.PromoID,
        VersionDate = a.VersionDate
    }).Distinct(comp).OrderBy(o => o.DealPeriod)
                                 .ThenByDescending(o => o.CustomerNumber)
                                 .ThenByDescending(o => o.LOB)
                                 .ThenByDescending(o => o.PromoID).ToList();
于 2013-08-14T18:46:39.490 に答える