2013-03-22 63 views
2

首先,我将寄我迄今所做的:重复的行去除

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 
     } 

这个查询工作完全只是问题是,我在firstnamelastname取回一个重复的行。我可以通过添加已经尝试过的Distinct()扩展方法来解决这个问题,它可以工作,但如果可以在没有任何扩展方法的情况下完成,我非常好奇。

那么我怎样才能得到结果表回来没有任何重复的行firstnamelastname

编辑:在这种情况下,我收到回这样的事:

enter image description here

我想获得相同类型的背部只有一个人用的总价值,他spent.Sorry为没有更好地解释我自己更好第一次忘了提及我想要回到人的总价值

+0

如果你有多个人名字相同的姓氏,如果同一个人有多个销售订单,或者如果同一个人有多个地址,你将有多个结果具有相同的“{FirstName,LastName} '。你确定这不是导致多行的原因吗? – dasblinkenlight 2013-03-22 12:11:33

+0

我对此感到不满,但是我不想让同一个人发出两次订单,即使有两个订单 – aleczandru 2013-03-22 12:12:24

+0

如果重复的情况下,您希望查询的输出样本是什么? – usr 2013-03-22 12:13:57

回答

1

你需要的是一个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将多行合并为一个,这正是您想要的。

+0

我已经尝试了你的查询,但似乎由于某种原因linqpad地址超出了选择语句的范围 – aleczandru 2013-03-22 12:53:12

+0

哦,我忽略了你也需要城市。但是同样的技术也适用于它 - 只需适当地修改我的示例代码即可。如果您有其他问题或疑问,请告知我。 – usr 2013-03-22 14:24:37