LINQ-to-SQL — ‘Sum’ внутри выбранного нового

#c# #linq-to-sql #sum

#c# #linq-to-sql #сумма

Вопрос:

У меня есть запрос 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
};
  

Однако, очевидно, что это возвращает новую строку для каждой доставки, что означает, что я должен суммировать их впоследствии, что кажется довольно неэффективным. Есть ли более простой способ?

Ответ №1:

Я знаю, что это старый вопрос, но, эй, я нашел его, так что, надеюсь, это поможет кому-то еще…

Вы также можете сделать это, используя свободный синтаксис:

 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)
                 });
  

Надеюсь, это кому-то поможет…

Ответ №2:

Если вы используете синтаксис запроса, вы можете сделать что-то вроде следующего

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

это не укладывается у меня в голове и не тестировалось

Комментарии:

1. Я просто писал точно такой же код, когда ты тоже меня победил 🙂

2. Лол, я печатаю намного быстрее, так как на SO

Ответ №3:

Не уверен, но вы можете попробовать функцию группового прощания, как показано ниже

 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)
};
  

Ответ №4:

Вы должны быть в состоянии сделать это:

 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();
  

Ответ №5:

     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