Простой вопрос на самом деле, но кажется сложным:
Я пытаюсь преобразовать следующее выражение 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. Любая помощь будет оценена.
В вашем запросе 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.
Возможно, более читаемый синтаксис
var total_hours_spent = DB.TimeRegistrations
.Where(e => e.Activity_Id_FK ==activity_id &&
e.date >=date.AddDays(30))
.Sum(e => e.timespan);
Используйте следующий код, чтобы найти общее количество потраченных часов
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);
Примените сумму после запроса, как этот,
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);
Надеюсь, что это решит вашу проблему