2017-10-12 45 views
1

我有一個需要拉從一個數據庫記錄拉不重複的記錄從數據庫中,我們假設這種結構使用兩列

ID,名稱,類型,鑰匙,EXPDATE,IsActive

現在有些重組已完成並且表格可能會根據ID和類型保存重複的記錄。我希望能夠使用linq從數據庫中提取記錄,但只能使用具有相同ID /類型的記錄之一。

EX:

1,佛瑞德,1,NewGuid,2019年12月15日,1

1,佛瑞德,1,NewGuid,2017年10月1日,1

2, Goerge,2,NewGuid,02/01/2018,1

我希望結果集是Fred和One for Goerge的1個記錄。實際上Fred的哪些記錄得到的回報並不重要,只有一個。

我試過使用DISTINCT,但是返回一個IDistinct而不是整個記錄。有沒有辦法使用linq來做到這一點?

這裏是我試過:

_table.AllReadOnly().Where(i => i.ID == id && i.IsActive).GroupBy(i => i.ID, i.Type).Select(i => i.FirstOrDefault()).ToList(); 
_table.AllReadOnly().Where(i => i.ID == id && i.IsActive).Distinct().ToList(); 

我知道.Distinct()一樣,什麼都不會做。我試圖找出如何做一個EqualityComparer,但我不知道如果這是我應該去的路線。

回答

0

您可以在這2欄中使用GroupBy,然後從每組中選擇第一個元素。例如:

var list = new List<Table1>() 
{ 
    new Table1(){ Column1="x", Column2="y", Column3= "z"}, 
    new Table1(){ Column1="x", Column2="y", Column3= "t"}, 
    new Table1(){ Column1="a", Column2="b", Column3= "c"}, 
}; 

var resulut = list.GroupBy(x => new { C1 = x.Column1, C2 = x.Column2 }) 
        .Select(g => g.FirstOrDefault()); 

其結果將是包含輸入列表的第一和第三元件的列表。

+0

謝謝,這工作。我想知道爲什麼這種方式和我的方式一樣。我剛剛返回了一份清單。 –

+0

不客氣。您已經通過簽名將'i.Type'作爲結果選擇器分組。你不需要它。 –