Asp.net 如何使用LINQ根据两个字段的组合选择distinct?
如何仅选择一行中只有两个值的不同组合的记录 例如,假设我有以下几点:Asp.net 如何使用LINQ根据两个字段的组合选择distinct?,asp.net,linq,entity-framework-5,where,Asp.net,Linq,Entity Framework 5,Where,如何仅选择一行中只有两个值的不同组合的记录 例如,假设我有以下几点: Name | Age | Height ------------------------------------ Joe 19 99 Kim 19 76 Joe 20 88 Joe 19 69 如何编写LINQ表
Name | Age | Height
------------------------------------
Joe 19 99
Kim 19 76
Joe 20 88
Joe 19 69
如何编写LINQ表达式以仅选择具有相同名称
和年龄
的行
我试过:
var count=context.people.Where(p=>(p.age&&p.name.Distinct())代码>
和var count=context.people.Where(p=>(p.age.Distinct()&&p.name.Distinct())代码>
正确的方法是什么?您可以选择匿名类型中的姓名和年龄,然后使用Distinct()
:
很明显,这不会给你一个高度,但是没有一个高度。如果您还想要所有高度,则需要分组:
var results = context.people
.GroupBy(p => new { p.Name, p.Age });
这将为您提供一系列分组,其中每个分组包含具有相同姓名和年龄的所有人。对于linq中的这些场景,您应该使用GroupBy
:
var result = people.GroupBy(p => new{p.Name, p.Age})
.选择(g=>g.Key)
更新:
正如Jon Skeet所提到的,这为您提供了一个基于Name
和Age
值的分组列表。例如,您可以添加。选择(g=>g.Max(p=>p.Height))
以获得类型List
的结果,其中包含每个姓名/年龄组中最高的姓名/年龄组。您期望的输出具体是什么样的?我认为这里不需要使用GroupBy,如果只需要姓名和年龄的话。@Jon Skeet:你说得对。但是,由于op提到选择行,我认为他也要包括高度。但在这种情况下,你的解决方案也失败了,因为它只选择了键(即姓名和年龄)
var result = people.GroupBy(p => new{p.Name, p.Age})