web-dev-qa-db-ja.com

LINQ-to-SQL-selectnew内の「Sum」

テーブルを介して実行されるLINQ-to-SQLクエリがあり、3つの合計(「Rate」と「AdditionalCharges」の合計)を選択したいので、次のようなものがあります。

var sums = from d in dc.Deliveries
where d.TripDate == DateTime.Now
select new
{
    Rate = d.Rate,
    AdditionalCharges = d.AdditionalCharges
};

ただし、明らかにこれにより、配信ごとに新しい行が返されます。つまり、後でそれらを合計する必要があります。これはかなり非効率的です。もっと簡単な方法はありますか?

11
Chris

クエリ構文を使用すると、次のようなことができます

var data = dc.Deliveries.Where(d => d.TripDate == DateTime.Now)
var rateSum = data.Sum(d => d.Rate);
var additionalCharges = data.Sum(d => d.AdditionalCharges);

これは私の頭のてっぺんから外れていて、テストされていません

13
NinjaNye

私はこれが古い質問であることを知っています、しかしねえ、私はそれを見つけました、それでうまくいけばこれは他の誰かを助けるでしょう...

Fluent構文を使用してこれを行うこともできます。

var sums = dc.Deliveries
             .Where(d => d.TripDate == DateTime.Now)
             .GroupBy(d => d.TripDate)
             .Select(g =>
                 new
                 {
                     Rate = g.Sum(s => s.Rate),
                     AdditionalCharges = g.Sum(s => s.AdditionalCharges)
                 });

これが誰かを助けることを願っています...

17
Dan VanWinkle

よくわかりませんが、以下のようにグループバイ機能を試すことができます

var sums = from d in dc.Deliveries
where d.TripDate == DateTime.Now
group d by new {d.Rate,d.AdditionalCharges,d.TripDate} into g
select new
{
    Rate = g.Sum(s => s.Rate ),
    AdditionalCharges = g.Sum(s => s.AdditionalCharges)
};
8
Pranay Rana

あなたはこれを行うことができるはずです:

DateTime d = DateTime.Now;
var sums = from d in dc.Deliveries
select new
{
    Rate = dc.Deliveries.Where(n => n.TripDate == d).Sum(n => n.Rate),
    AdditionalCharges = dc.Deliveries.Where(n => n.TripDate == d).Sum(n => n.AdditionalCharges)
};

var result = sums.FirstOrDefault();
3
Nate Zaugg
    var sums = from d in dc.Deliveries
    where d.TripDate == DateTime.Now
    Group by d.TripDate // or primary key
    Into TotalRate = sum(d.Rate),
    TotalAdditionalCharges = sum(d.AdditionalCharges)
    Select TotalRate , TotalAdditionalCharges
0
Akhil