Я не так хорошо знаком с EF Core, но если он работает аналогично EF6, то когда вы вызываете .ToList () для DbSet, он фактически делает эквивалент SQL Select * для таблицы / entity.
Таким образом, делая
var list = Entities.ToList();
Вы возвращаете все записи для этого объекта в память. Затем он фильтрует данные в памяти:
return list.Where(x => ((bool?)x.GetType().GetProperty("IsDeleted").GetValue(x)) == false).ToList();
Если вы сделаете что-то вроде:
return Entities.Where(x => !x.IsDeleted).ToList()
Сгенерированный SQL будет включать в себя предложение where и будет гораздо более эффективным.
Обновлено 04/05/2020:
Чтобы включить фильтр для обобщенного типа c, можно создать выражение и передать его в оператор LINQ:
var props = typeof(TEntity).GetProperties();
if (props.Any(p => p.Name == "IsDeleted"))
{
ParameterExpression pe = Expression.Parameter(typeof(TEntity), "x");
ConstantExpression valExpression = Expression.Constant(true, typeof(bool));
MemberExpression member = Expression.Property(pe, "IsDeleted");
Expression predicateBody = Expression.Equal(member, valExpression);
var final = Expression.Lambda<Func<TEntity, bool>>(body: predicateBody, parameters: pe);
return Entities.Where(final.Compile()).ToList();
}
else
{
return Entities.ToList();
}
Если у всех ваших сущностей есть свойство IsDeleted, тогда проверка, чтобы проверить, существует ли она, может быть удалена. Код не был проверен, но должен быть в правильном направлении.