2013-03-22 90 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