EF пытается преобразовать ваш запрос в SQL, и поскольку нет прямого сопоставления между вашим методом и сгенерированным SQL, вы получаете ошибку.
Первый вариант - не использовать метод, а вместо этогонапишите содержимое метода непосредственно в исходном запросе (в настоящий момент я не уверен, сработает ли это, поскольку у меня нет работающей VS).В случае, если это сработает, вы, скорее всего, в итоге получите очень сложный SQL с низкой производительностью.
Итак, вот второй вариант: не бойтесь использовать несколько запросов, чтобы получить то, что вынеобходимость.Иногда также имеет смысл отправить более простой запрос в БД и продолжить модификации (агрегация, выбор, ...) в коде C #.Запрос переводится в SQL каждый раз, когда вы пытаетесь перечислить его, или если вы используете один из методов ToList
, ToDictionary
, ToArray
, ToLookup
или если вы используете First
, FirstOrDefault
, Single
или SingleOrDefault
вызовы (подробности см. В документации LINQ ).
Один из возможных примеров, который может исправить ваш запрос (но, скорее всего, не лучшее решение),чтобы начать свой запрос с:
var seasonHoursByYear =
from d in context.AuxiliaryDateHours.ToList()
[...]
и продолжить со всеми остальными.Это незначительное изменение имеет фундаментальное влияние:
- путем вызова
ToList
БД будет немедленно запрошена, и вся таблица AuxiliaryDateHours
будет загружена в приложение (это будет проблемой производительности, если таблицаслишком много строк) - при вызове вашего метода QuerySeasonLimits будет сгенерирован второй запрос (для этого можно / нужно также включить вызов
ToList
) - остальная часть
seasonHoursByYear
запрос: where
, группировка, ... произойдет в памяти
Есть несколько других моментов, которые могут быть не связаны в этой точке.
У меня нетизучил цель вашего кода - поскольку это могло привести к дальнейшей оптимизации - даже к полному доработке, которая могла бы принести вам больше прибыли в итоге ...