SUM () в SQL для LINQ

1

Простой вопрос на самом деле, но кажется сложным:

Я пытаюсь преобразовать следующее выражение SQL Query в LINQ:

select SUM(timespan) as timespan from TimeRegistrations as tr 
where Activity_Id_FK =1 and tr.date>= DATEADD(DAY,-30,GETDATE());

Это то, что у меня есть до сих пор:

var total_hours_spent = from e in DB.TimeRegistrations 
where e.Activity_Id_FK ==activity_id && e.date >=date.AddDays(30)
select e.Sum(e.timespan); 

Компилятор жалуется на e.Sum(e.times). Я не знаю, как выбрать сумму временного интервала из таблицы TimeRegistrations. Любая помощь будет оценена.

Теги:
linq
linq-to-sql

4 ответа

2
Лучший ответ

В вашем запросе e есть единый TimeRegistration с его Activity_Id_FK, датой и другими полями. Итак, проблема здесь:

e.Sum(e.timespan)

Здесь у вас есть две проблемы: первая из них вызывает Sum на сущности (это не запрашиваемый набор сущностей - в едином объекте нечего суммировать). И вы пропустили синтаксис метода Sum - он должен принять lambda с селектором свойств Sum(e => e.timespan).

Вы должны выбрать timespan значения из TimeRegistrations таблицы, а затем вызвать Sum() метод:

(from e in DB.TimeRegistrations 
 where e.Activity_Id_FK ==activity_id && e.date >= date.AddDays(30)
 select e.timespan).Sum()

SQL-запрос будет сгенерирован только при вызове Sum(), поэтому он будет в конечном итоге запрошенным вами запросом. Вы также можете выбрать всю сущность TimeRegistrations а затем выбрать, какое поле будет суммироваться (тот же запрос будет сгенерирован):

(from e in DB.TimeRegistrations 
 where e.Activity_Id_FK ==activity_id && e.date >= date.AddDays(30)
 select e).Sum(e => e.timespan)

Мне не нравится смешивать синтаксис запросов с вызовами метода, поэтому здесь используется чистый синтаксис лямбда:

DB.TimeRegistrations
  .Where(e => e.Activity_Id_FK == activity_id && e.date >= date.AddDays(30))
  .Sum(e => e.timespan)

BTW: Небольшой совет - выберите имена переменных, которые коррелируют с сущностью, которую они представляют. Например, вместо e иду с переменной r или tr для представления объекта TimeRegistration.

  • 0
    Я предполагаю, что какое-то объяснение идет так же, как и код?
  • 0
    @JonSkeet, как вы всегда делаете)
Показать ещё 3 комментария
0

Возможно, более читаемый синтаксис

var total_hours_spent = DB.TimeRegistrations
                          .Where(e => e.Activity_Id_FK ==activity_id && 
                                      e.date >=date.AddDays(30))
                          .Sum(e => e.timespan); 
0

Используйте следующий код, чтобы найти общее количество потраченных часов

var total_hours_spent = (from e in DB.TimeRegistrations 
    where e.Activity_Id_FK ==activity_id && e.date >=date.AddDays(30)
    select e).Sum(e => e.timespan.TotalHours);
0

Примените сумму после запроса, как этот,

var total_hours_spent = (from e in DB.TimeRegistrations 
where e.Activity_Id_FK ==activity_id && e.date >=date.AddDays(30)
select e).Sum(e => e.timespan); 

Надеюсь, что это решит вашу проблему

  • 0
    Есть ли что-то новое в вашем ответе?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню