2016-12-19 20 views
0

我應該如何選擇不同的使用LINQ時,有類似的對象選擇不同的到以下幾點:使用LINQ,但基礎不同的另一列

public class foo 
{ 
    public int id { get; set; } 
    public string lang { get; set; } 
    public string name { get; set; }  
} 

列表可以是:

id = 1, lang = "en", name="test1" 
id = 1, lang = "fr", name="test2" 
id = 1, lang = "de", name="test3" 
id = 2, lang = "en", name="test4" 
id = 2, lang = "fr", name="test5" 
id = 3, lang = "en", name="test6" 
id = 3, lang = "fr", name="test7" 
id = 4, lang = "en", name="test8" 
id = 5, lang = "de", name="test9" 

我想運行LINQ,以便它返回不同的id值,但不同的id值應該根據lang進行過濾,例如「FR」,應檢索結果如下:

id = 1, lang = "fr", name="test2" 
id = 2, lang = "fr", name="test5" 
id = 3, lang = "fr", name="test7" 
id = 4, lang = "en", name="test8" 
id = 5, lang = "de", name="test9" 

在座的各位專家LINQ,我使用的λ理想尋找查詢,這將是一個很大的幫助。提前致謝。

+3

這聽起來更像簡單'Where'而不是' Distinct'。 –

+0

'foos.Where(x => x.lang ==「fr」)' –

+0

謝謝Evan&Jason。我更改了描述,如果沒有「fr」記錄,我需要檢索其他記錄。 – maverick

回答

0

將產品按id進行分組,按組別排序,按第lang != "fr"排序。這將使「FR」項目浮到每個組的頂部(truefalse排序):

list.GroupBy(f => f.id) 
    .Select(g => g.OrderBy(f => f.lang != "fr").FirstOrDefault()) 
+0

要解決「無法轉換」錯誤,您應該顯示您的原始代碼。這與LINQ沒有直接關係。 –

+0

這工作就像一個魅力格特。非常感謝。 – maverick

0

你看這個:

foos.GroupBy(el => el.id) 
    .Select(gr => new 
     { 
      foo = gr.Any(el => el.lang == "fr") ? gr.FirstOrDefault(el => el.lang == "fr") : gr.FirstOrDefault() 
     }); 
+0

每組執行兩次迭代。如果你做'gr.FirstOrDefault(el => el.lang ==「fr」)?? gr.FirstOrDefault()'這會減少到每個組一次或兩次迭代。 –

+0

您好蒂姆&格特,謝謝,它似乎現在返回null,所以不知道如果我使用正確的語法: \t \t \t IQueryable allIndexCenters = ContentService.GetAllCenters(); IQueryable allCenters = null; allIndexCenters.GroupBy(x => x.FREDID) 。Select(gr => new { allCenters = gr.Any(el => el.Language ==「fr」)?gr.FirstOrDefault(el => el .Language ==「fr」):gr.FirstOrDefault() })。AsQueryable(); – maverick

+0

當我試圖執行以下操作: VAR allCenters = allIndexCenters.GroupBy(X => x.FREDID) 。選擇(GR =>新 { SearchResultCentrePage = gr.Any(EL => el.Language == 「FR」 )?gr.FirstOrDefault(el => el.Language ==「fr」):gr.FirstOrDefault() })。AsQueryable(); \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t我得到errorm消息:不能從轉換 'System.Linq.IQueryable <<匿名類型:Search.SearchResultPage SearchResultPage >>' 到「系統.Linq.IQueryable ' – maverick