我尝试创建用于过滤数据库中不同实体的通用方法,以避免为每个实体创建大量方法,并使用非常相似的 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");
我想定义匿名表达式,描述如何获取列的值,然后应用不同的过滤器(这里显示了使用 equal 方法的简单示例)。
但是当我调用 Expression.Equal 时,我得到了一个错误,即 Func 和 Int32 没有二元运算符。
在所有示例中,都创建了具有属性名称的 Expression.Parameter 对象,但它们仅对 Entity 类中的属性进行操作(不使用导航属性等)。 但是是否可以将过滤器表达式与匿名属性表达式结合起来?
我希望我清楚地描述了我想要实现的目标以及与标准示例的区别,这是我问题的根源
如果有人帮助我如何创建这样的过滤器,以便将参数中给出的表达式的结果与值进行比较,然后将谓词应用于查询以便针对 sql 数据库运行它,我将不胜感激:)
相关分类