【发布时间】:2015-04-06 08:18:07
【问题描述】:
我在我的程序中使用动态过滤器,如下解决方案:
public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable) where T : class ,IModel
{
var someIds = new int[]{1,2,3,4,5};
var userId = 2;
Expression<Func<T, bool>> predicate1 = e => someIds.Contains(e.Id);
Expression<Func<T, bool>> predicate2 = e => e.UserId==userId;
Expression<Func<T, bool>> predicate3 = e => e.CreatedDate != null;
var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));
var pred2 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(pred1, predicate3));
var result = queryable
.Where(pred2);
return result;
}
IModel是这样的:
Public interface IModel{
int Id { get; set; }
int UserId { get; set; }
DateTime? CreatedDate { get; set; }
}
但是,我得到了这个错误:
二元运算符 Or 没有为类型“System.Func
2[AnyClass,System.Boolean]' and 'System.Func2[AnyClass,System.Boolean]”定义。
在这一行:
var pred1 = Expression.Lambda<Func<T, bool>>(System.Linq.Expressions.Expression.Or(predicate1, predicate2));
我该如何解决这个问题?
感谢任何帮助
【问题讨论】:
-
这个
someIds.Contains(e.Id)不正确。IModel不包含Id字段。 -
你为什么使用 Expression 而不是 Func?
-
你离你需要的太远了......你必须使用
Expression.OrElse,因为Expression.Or是|运算符。 -
但真正的问题是您不能以这种方式加入 Lambda 表达式(
predicate1、2、3)。连接表达式很复杂,因为predicate1、2、3的输入参数不同(就像是e1、e2、e3而不是e)和pred1和pred2将有一个e4和e5。 -
@AlexVoskresenskiy 因为他使用的是
IQueryable,它只适用于Expression。
标签: c# linq expression