1

LINQ で書いているクエリに関するクエリがあり、誰かが助けてくれることを願っています。基本的に私は以下を持っています(サンプルデータ)

ProductCode  LanguageID   LegislationId   Version
1234         English       UK              1
1234         English       UK              2
5678         English       UK              1
9999         English       UK              1
9999         English       UK              2
9999         Spanish       Spain           1

そのため、LanguageID や Description など、ユーザーが指定した条件に基づいてレコードを返す必要があります。ここで注意が必要なのは、同じ製品コード、言語、法律の複数のバージョンがある場合、最新バージョンのみを返したいということです。

だから...私のコードは次のとおりです(pLegislationsには、コンマで区切られた法律のリストが含まれています):

List<string> legList = pLegislations.Split(',').ToList();
IEnumerable<MyClass> results = null;

results = (from a in context.ALLProducts
           let prodCode = a.ProductCode
           let prodDesc = a.ProductDescription
           where legList.Contains(a.LegislationID) &&
                 (a.LanguageID == pLanguage || pLanguage == null) &&
                  a.BrandName == pMarket &&
                 (prodCode.Contains(pSearch) || prodDesc.Contains(pSearch) || 
                                                pSearch == string.Empty) &&
                 prodCode[0] != 'x' &&
                ((pMarket == "testMarket") ? prodCode.StartsWith("0") : true)
                select new MyClass
                {
                   BrandName = a.BrandName,
                   BulkCode = prodCode,
                   BulkDescription = prodDesc,
                   Language = a.LanguageName,
                   LanguageCode = a.LanguageID
                }).ToList();

複数のバージョンがない場合、これはすべて正常に機能するので、私の質問は、ProductCode、Language、および Legislation に一致する場合、つまり Language = ' English' および Legislation = 'UK' の場合、次の結果が期待されます。

ProductCode  LanguageID   LegislationId   Version
1234         English       UK              2
5678         English       UK              1
9999         English       UK              2
9999         Spanish       Spain           1

前もって感謝します

アンドリュー

4

1 に答える 1

1

(1) で結果をグループ化し、最大値 (2)ProductCodeを持つ各グループ項目から選択します。Version

results = (from a in context.ALLProducts
           let prodCode = a.ProductCode
           let prodDesc = a.ProductDescription
           where legList.Contains(a.LegislationID) &&
                 (a.LanguageID == pLanguage || pLanguage == null) &&
                  a.BrandName == pMarket &&
                 (prodCode.Contains(pSearch) || 
                  prodDesc.Contains(pSearch) || 
                  pSearch == string.Empty) &&
                  prodCode[0] != 'x' &&
                 ((pMarket == "testMarket") ? prodCode.StartsWith("0") : true)
           group a by a.ProductCode into g // 1
           let lastProduct = g.OrderByDescending(x => x.Version).First() // 2
           select new MyClass
                {
                   BrandName = lastProduct.BrandName,
                   BulkCode = prodCode,
                   BulkDescription = prodDesc,
                   Language = lastProduct.LanguageName,
                   LanguageCode = lastProduct.LanguageID
                }).ToList();
于 2013-06-07T10:33:42.370 に答える