Ужасное название, я знаю ...
Это работает и дает мне то, что я ищу, но я знаю, что должен быть лучший способ сделать это:
var query = (from a in DB
where a.Date.HasValue
select a).AsEnumerable();
double avg = (from a in query
select (a.Date.Value.Subtract(a.OtherDate).Days).Average();
По сути, a.Date - это обнуляемая дата-время, и я хочу получить среднее значение (a.Date - a.OtherDate) только тогда, когда a.Date существует (иначе расчет не будет работать).
Подобные вещи не будут работать:
double avg = (from a in DB
where a.Date.HasValue
select a.Date.Value.Subtract(a.OtherDate).Days).Average();
Я знаю, что видел подобные проблемы, когда решением было явным образом установить для поля Nullable значение NULL, которое заставило бы работать метод Average.Я не видел , где обнуляемое поле было частью вычислений, подобных этому.
Заранее спасибо.
Редактировать: Очиститьвсе немного, позвольте мне дать вам решение Бена и сообщение об ошибке, которое оно генерирует.Я должен признать, что я упустил еще одну часть ... a.OtherDate на самом деле немного сложнее ... позвольте мне проиллюстрировать:
var avg = DB.Where(a => a.Date.HasValue)
.Where(a => a.ForeignKeyReference.Date.HasValue)
.Select(a => a.Date.Value.Subtract(a.ForeignKeyReference.Date.Value).Days)
.Average();
... и ошибку:
InvalidOperationException: Не удалось перевести выражение 'Таблица (БД). Где (a => a.Date.HasValue) .Where (a => a.ForeignKeyReference.Date.HasValue) .Select (a => a.Date.Value.Subtract (a.ForeignKeyReference.Date.Value) .Days) .Average () 'в SQL и не может обрабатывать его как локальное выражение.
Похоже, что метод "Subtract" или свойство "Days"не имеет перевода на SQL.Мой первый пример работал, потому что второй запрос был LINQ к объектам.Кто-нибудь знает, есть ли способ написать запрос LINQ таким образом, который будет переводить в SQL?