Этот запрос также не работал в EF Core 2.2. Это приведение не имеет смысла в SQL - в SQL нет интерфейсов или наследования. У EF Core до 3-х была ... неудачная функция - оценка на стороне клиента. Если EF Core не сможет что-то перевести на SQL, он все потянет к клиенту и попытается отфильтровать там данные. Излишне говорить, что это пагубно для производительности. Хуже того, это было сделано без предупреждения. Предупреждение или исключение позволит вам распознать и устранить проблему. По крайней мере, в EF Core 2.2 можно было отключить оценку на стороне клиента. В EF Core 3 это ушло навсегда.
Что касается самого метода, то вам вообще не понадобится это приведение, если вы используете ограничение типа, например:
public static IQueryable<T> _enableFilter<T>(this IQueryable<T> queryable)
where T:IEnable
{
return queryable.Where(x => (x as IEnable).Enable);
}
Я не уверен, что EF Core примет это - это необычный синтаксис. Намного проще просто добавить это дополнительное условие, например:
_newsRepository.BaseQuery.EnableFilter().FirstOrDefaultAsync(x => x.Id == model.Id && x.Enabled);
Global Queries и Soft удаляет
Если вы хотите применить условие фильтра ко всем запросамиспользуя конкретную сущность, например, для программного удаления, вы можете использовать глобальные фильтры . Фактически, soft-delete является первым сценарием, упомянутым в документации.
В вашем контексте OnModelCreating()
метод, который вы можете добавить:
modelBuilder.Entity<SomeEntity>().HasQueryFilter(p => p.IsEnabled);