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

メソッドの構文を示しますが、select 部分の内容は同じです。

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 に答える