2012-02-10 57 views
5

我想在我的DataGrid中顯示那些共享相同列值的行。LINQ:根據列值選擇重複的行

例如,對於人,誰擁有相同的姓氏,我嘗試這樣做:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).Select(grp => grp.Key); 

這工作看起來,我的WPF DataGrid中包含此命令後的行...它最終只顯示空行,因爲沒有列填充值。

或者我試圖與人,誰具有相同的城市:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.City).Where(grp => grp.Count() > 1).Select(grp => grp.Key).Select(a => a); 

有沒有做到這一點任何適當的方式?

+0

我不確定被問到的問題。澄清,第一個代碼示例工作,但第二個示例不? – Bryan 2012-02-10 16:58:56

+0

兩者都不起作用,因爲第一個只返回空行(但它返回一些,至少...),第二個不返回 – SeToY 2012-02-10 16:59:40

+1

所以這意味着您的數據庫中有多個包含SurName空值的行?看起來他們都在工作,只是沒有返回你期望的數據。這將有助於查看「地址」和「人」的類定義。 – Bryan 2012-02-10 17:01:34

回答

9

您只選擇在你的榜樣關鍵:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).Select(grp => **grp.Key**); 

我假設你正在嘗試做的是選擇整行:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => a.SurName).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

比較姓和名:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => new Tuple<String, String>(a.ForeName, a.SurName)).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

編輯:對於L2E,你可以(我認爲)使用匿名類型:

dataGrid.ItemsSource = _dataContext.Addresses.GroupBy(a => new { a.ForeName, a.SurName }).Where(grp => grp.Count() > 1).SelectMany(grp => grp.Select(r=>r)); 

以上可能是不正確的 - 不是100%確定。

+0

謝謝,我相信這是有效的......我應該如何修改查詢以便不僅比較SurNames,而且ForeNames也是如此? .GroupBy(a => a.ForeName,a.SurName)不起作用。 – SeToY 2012-02-10 17:37:43

+0

你的意思是「顯示匹配名字和姓氏的行」?看我的編輯。 – 2012-02-10 17:39:51

+0

是的,名字和姓氏相同的行 – SeToY 2012-02-10 17:40:19