Прежде всего я знаю о критических изменениях в EF Core 3, как описано в https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq -запросы «больше не оцениваются на клиенте»
Но я все еще немного сбит с толку относительно того, почему следующий код не работает:
var posts = await _applicationDbContext.Posts
.Include(p => p.Account)
.Include(p => p.Recording)
.Where(p => p.AccountId == accountId && p.Type == postType && p.IsValid)
.OrderByDescending(p => p.Occured)
.ToListAsync();
Создание исключения
System.InvalidOperationException: выражение LINQ 'DbSet .Where (p = > p.AccountId == __accountId_0 && (int) p.Type == (int) __ postType_1 && p.IsValid) 'не удалось перевести. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо в AsEnumerable (), AsAsyncEnumerable (), ToList (), либо в ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.
Реализация IsValid выглядит следующим образом:
public bool IsValid => Status == PostStatus.Active && Recording.IsValid
public bool IsValid => Status == RecordingStatus.Active;
Теперь, если я изменю запрос на:
var posts = await _applicationDbContext.Posts
.Include(p => p.Account)
.Include(p => p.Recording)
.Where(p => p.AccountId == accountId && p.Type == postType && p.Status == PostStatus.Active && p.Recording.Status == RecordingStatus.Active)
.OrderByDescending(p => p.Occured)
.ToListAsync();
Работает и преобразуется в sql, как и ожидалось. Естественно, я мог бы go со второй реализацией, но есть очевидные преимущества наличия реализации IsValid в одном месте. Я также не хочу пропустить проверку IsValid в запросе, чтобы сделать это в памяти позже по понятным причинам. Я что-то здесь упускаю?