Я пытаюсь создать универсальный метод для фильтрации различных объектов в базе данных, чтобы избежать создания огромных методов для каждого объекта с объединением правил фильтрации с использованием очень похожих операторов if.
Теперь я пытаюсь создать выражение, котороебудет представлять равенство сравнения, получая в качестве выражения параметра, описывающего свойство для сравнения и некоторое значение.
Моя концепция решения проблемы и того, что я создал на основе других сообщений, показывает фрагмент кода ниже:
public class FuelCard
{
public int Id { get; set; }
public string Number { get; set; }
public virtual User User { get; set; }
}
public static IQueryable<TEntity> ApplyFilter<TEntity, TProperty>(
this IQueryable<TEntity> query,
Expression<Func<TEntity, TProperty>> expr, TProperty value)
{
Expression<Func<TEntity, bool>> predicate = param => true;
var filterExpression = Expression.Equal(expr, Expression.Constant(value));
var lambda = Expression.Lambda<Func<TEntity, bool>>(filterExpression);
predicate = predicate.And(lambda);
return query.Where(predicate);
}
И в конце я хотел бы использовать это так:
IQueryable<FuelCard> query = // Get cards from database as IQueryable
query = query.ApplyFilter(x => x.Id, 85);
query = query.ApplyFilter(x => x.User.LastName + " " + x.User.FirstName, "Jon Green");
Я хотел бы определить анонимные выражения, описывающие, как получить значение столбцов, а затем применить различные фильтры (здесь показан простой пример с равным методом).
Но когда я вызываю Expression.Equal, я получаю сообщение об ошибке, что для Func и Int32 нет двоичного оператора.
Во всех примерах создаются объекты Expression.Parameter с именемсобственности, но там они работают только на профиправа в классе Entity (без использования свойств навигации и т. д.). Но возможно ли объединить выражение фильтра с анонимным выражением свойства?
Надеюсь, я четко описал, чего я пытаюсь достичь и в чем отличие от стандартных примеров, являющихся источникоммои проблемы
Я был бы очень признателен, если бы кто-нибудь помог мне создать такой фильтр, чтобы сравнить результат выражения в заданном параметре со значением, а затем применить предикат к запросу, чтобы выполнить его сбаза данных sql:)