2013-02-06 115 views
0

我使用LinQPad和AdventureWorks LT DB學習LINQ查詢。SQL到LINQ轉換 - 分組由

我想將下面的SQL轉換爲LINQ,它是成功的,併產生我想要的。

SELECT SalesOrderID, SUM(OrderQty) as TotalQty, SUM(UnitPrice) as TotalPrice 
FROM SalesLT.SalesOrderDetail detail 
WHERE detail.SalesOrderID = '71920' 
GROUP BY detail.SalesOrderID; 

SQL Resultset

LINQ查詢的替代品的上方。

from detail in SalesOrderDetails 
where detail.SalesOrderID.Equals(71920) 
group detail by detail.SalesOrderID into g 
select new { 
    SalesOrderID = g.Select(item =>item.SalesOrderID).Distinct().First(),  /*Distinct() : Enumerable<Int32>, First() Int32 */ 
    TotalQty = g.Select(item =>Convert.ToDouble(item.OrderQty)).Sum(), 
    TotalPrice = g.Select(item =>item.UnitPrice).Sum() 
} 

LINQ Result

但我想知道它是必要使用

Select new { ... } 

創建另一個struct?是否有可能縮短語法?

謝謝。

回答

4

幾個因素可以縮短,在你的select new

我給你的方法的語法,但選擇部分的內容是相同的。

SalesOrderDetails.Where(sod => sod.SalesOrderID == 71920) 
       .GroupBy(sod => sod.salesOrderID) 
       .Select(g => new { 
           SalesOrderId = g.Key, 
           TotalQty = g.Sum(i => Convert.ToDouble(i.OrderQty)), 
           TotalPrice = g.Sum(i => i.UnitPrice) 
           }); 
+0

+1:擊敗我9秒; p我會離開我的替代語法。我也喜歡'g.Key'的用法:) – leppie

+0

@leppie然後+1替代語法;) –

2

點點短

from detail in SalesOrderDetails 
where detail.SalesOrderID.Equals(71920) 
group detail by detail.SalesOrderID into g 
select new { 
    SalesOrderID = g.Key,  
    TotalQty = g.Sum(item =>Convert.ToDouble(item.OrderQty)), 
    TotalPrice = g.Sum(item =>item.UnitPrice) 
} 

Distinct似乎沒有必要。另外,如果您指定SalesOrderId,爲什麼再次選擇它?