LINQ:根据列值选择重复行

6

我想在我的DataGrid中显示那些共享相同列值的行。

例如,对于具有相同姓氏的人,我尝试了以下方法:

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

有没有适当的方法来做这件事?

我不确定所问的问题。为了澄清,第一个代码示例有效,但第二个示例无效? - Bryan
两者都不起作用,第一个仅返回空行(至少它确实会返回一些),第二个则没有任何返回。 - SeToY
1
那么这意味着你的数据库中有多行SurName的值为空?看起来它们都在工作,只是没有返回你期望的数据。看一下AddressPerson的类定义会有帮助。 - Bryan
1个回答

11

在你的例子中,你只选择了键(key):

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%正确。


谢谢,我相信这可以工作...为了不仅比较姓氏还比较名字,我应该如何修改查询?.GroupBy(a => a.ForeName, a.SurName)并不起作用。 - SeToY
你的意思是“显示与名字和姓氏匹配的行”?请看我的修改。 - Chris Shain
是的,当名字和姓氏相等时的行 - SeToY
此代码引发异常:在LINQ to Entities中,仅支持无参数构造函数和初始化程序。 - SeToY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接