Так что эту строку немного сложно прочитать без прокрутки назад и вперед, поэтому я надеюсь, что вы не возражаете, что я переформатировал ее для моего собственного согласия:
var matches = _context
.Matches
.Include(e => e.HomeTeam)
.Include(e => e.AwayTeam)
.Include(e => e.League)
.AsQueryable()
.Where(m => m.LeagueId == leagueId)
.OrderBy(m => m.MatchDate)
.ThenBy(m => m.Time)
.Where(m => ((todayDate - m.MatchDate).Days) <=7)
.Select(m => DTOConverter.ConvertMatchToDTO(m));
Чтение через этоЯ вижу, что ваше второе предложение .Where
проверяет значение свойства .Days
одной даты минус другая. Я сомневаюсь, что Entity Framework способна перевести это в действительный SQL, поэтому вы видите эту ошибку.
Есть ли причина, по которой вы не можете рассчитать на клиенте, какая дата является "допустимой", а затем простоSQL фильтрует строки по необходимости? Например:
.Where(m => m.MatchDate >= DateTime.Now && <= DateTime.Now.AddDays(7))
Это должно быть переведено в оператор TSQL BETWEEN
- что гораздо лучше, чем попытка проанализировать время, которое вы сохранили, чтобы получить часть дня и работуесли они на конкретное число от заданной даты.
Тем не менее, вы, возможно, захотите взглянуть на запрос, который вы написали в целом. Я не совсем уверен из предоставленного вами фрагмента, почему .AsQueryable
необходим - методы расширения, которые вы используете, принимают как IEnumerable
, так и IQueryable
, поэтому вам не нужно приводить.
Я бы также объединил два предложения where перед попыткой упорядочить набор результатов. Не уверен, что EF to SQL достаточно умен во всех случаях, чтобы оптимизировать это, но это не повредит! В итоге ваш окончательный запрос должен выглядеть примерно так:
var matches = _context
.Matches
.Include(e => e.HomeTeam)
.Include(e => e.AwayTeam)
.Include(e => e.League)
.Where(m =>
m.LeagueId == leagueId
&& m.MatchDate >= DateTime.Now && <= DateTime.Now.AddDays(7))
.OrderBy(m => m.MatchDate)
.ThenBy(m => m.Time)
.Select(m => DTOConverter.ConvertMatchToDTO(m));