0

我使用 LinQPad 和 AdventureWorks LT DB 来学习 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 结果集

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 结果

但我知道这是必要的使用

 Select new { ... }

创造另一个struct?是否可以缩短语法?

谢谢。

4

2 回答 2

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)
                              });
于 2013-02-06T06:44:23.530 回答
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,为什么要再次选择它?

于 2013-02-06T06:44:32.660 回答