我看到连接的topic,但是...

我正在尝试实现规范模式。如果我使用System.Linq.Expressions API显式创建Or或And表达式,则会收到错误消息



例如,这是我的代码

public class Employee
{
    public int Id { get; set; }
}

Expression<Func<Employee, bool>> firstCondition = x => x.Id.Equals(2);
Expression<Func<Employee, bool>> secondCondition = x => x.Id > 4;


Expression predicateBody = Expression.OrElse(firstCondition.Body, secondCondition.Body);
Expression<Func<Employee, bool>> expr =
    Expression.Lambda<Func<Employee, bool>>(predicateBody, secondCondition.Parameters);
Console.WriteLine(session.Where(expr).Count()); - //I got error here

已编辑

我尝试使用Specification pattern with Linq to Nhibernate,因此在我的工作代码中如下所示:
ISpecification<Employee> specification = new AnonymousSpecification<Employee>(x => x.Id.Equals(2)).Or(new AnonymousSpecification<Employee>(x => x.Id > 4));
var results = session.Where(specification.is_satisfied_by());

所以我想使用这样的代码x => x.Id> 4。

已编辑

所以我的解决方案是
 InvocationExpression invokedExpr = Expression.Invoke(secondCondition, firstCondition.Parameters);
var expr = Expression.Lambda<Func<Employee, bool>>(Expression.OrElse(firstCondition.Body, invokedExpr), firstCondition.Parameters);
Console.WriteLine(session.Where(expr).Count());

谢谢@Jon Skeet

最佳答案

这些主体中的每一个都有一组单独的参数,因此仅使用secondCondition.Parameters不会给firstCondition.Body一个参数。

幸运的是,您根本不需要自己编写所有这些内容。只需使用Joe Albahari的 PredicateBuilder -一切都为您完成。

09-30 17:23
查看更多