C# 重复行删除
首先,我将发布我迄今为止所做的工作:C# 重复行删除,c#,linq,C#,Linq,首先,我将发布我迄今为止所做的工作: from person in Persons join customer in Customers on person.BusinessEntityID equals customer.PersonID join salesOrderHeader in SalesOrderHeaders on customer.CustomerID equals salesOrderHeader.CustomerID where salesOrderHeader.SubTo
from person in Persons
join customer in Customers on person.BusinessEntityID equals customer.PersonID
join salesOrderHeader in SalesOrderHeaders on customer.CustomerID equals salesOrderHeader.CustomerID
where salesOrderHeader.SubTotal > 1000
join address in Addresses on salesOrderHeader.BillToAddressID equals address.AddressID
where address.City == "Melton"
select new {
person.FirstName,
person.LastName,
salesOrderHeader.SubTotal,
address.City
}
此查询工作正常,但问题是我返回了firstname
和lastname
上的重复行。我可以通过添加Distinct()
扩展方法来解决这个问题,扩展方法已经尝试过了,而且很有效,但是如果不使用任何扩展方法也可以实现的话,我非常好奇
那么,如何在firstname
和lastname
上没有任何重复行的情况下返回结果表呢
编辑:在这种情况下,我收到了如下内容:
我只想拿回一个与他花费的总价值相同的人。很抱歉第一次没有更好地解释我自己忘记提到我想拿回这个人的总价值。你需要的是一个GroupBy和一个聚合
from person in Persons
join customer in Customers on person.BusinessEntityID equals customer.PersonID
join salesOrderHeader in SalesOrderHeaders on customer.CustomerID equals salesOrderHeader.CustomerID
where salesOrderHeader.SubTotal > 1000
join address in Addresses on salesOrderHeader.BillToAddressID equals address.AddressID
where address.City == "Melton"
group salesOrderHeader by new { person.FirstName, person.LastName } into g //new
select new {
g.Key.FirstName,
g.Key.LastName,
SubTotal = g.Sum(salesOrderHeader => salesOrderHeader.SubTotal),
address.City
}
GroupBy将多行折叠为一行,这就是您在这里想要的。如果您有多个姓名相同的人在其中,如果同一个人有多个销售订单,或者如果同一个人有多个地址,您将有多个相同的结果
{FirstName,LastName}
。你确定这不是导致多行的原因吗?我同意这一点,但我不想让同一个人的订单重复两次,即使有两个订单。如果有重复的订单,您希望该查询的示例输出是什么?换句话说,如果有多个SalesOrderHeader,您希望发生什么?解决方案显然取决于答案。我尝试了你的查询,但似乎出于某种原因,linqpad中的地址超出了select语句的范围。哦,我忽略了你也需要城市。但是同样的技术也适用于它——只要适当地修改我的示例代码,它就会工作。如果您还有其他问题,请告诉我。