簡體   English   中英

LINQ to SQL-跨多個列的不同記錄

[英]LINQ to SQL - Distinct records across multiple columns

我有一個關於我用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 =',我應該如何過濾它,以便僅返回最新版本。英語”和法律=“英國”,那么我期望得到以下結果:

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

提前致謝

安德魯

將結果按ProductCode (1)分組,然后從每個分組項目中選擇具有最大Version值(2)的項:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM