这个 PredicateBuilder 类如何工作?
我一直在阅读 Joseph Albahari 关于 C# 4.0 的精彩著作,并且偶然发现了这门课:
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}
任何人都可以向我解释一下这个函数的用途以及它是如何工作的吗?我知道它用于向表达式树添加 and
和 or
条件,但它实际上是如何工作的?我从来没有使用过像Expression之类的类。这段具体代码是做什么的?
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
我知道 Func 是一个委托,它应该返回 true 或 false,但是这段代码通常在做什么?
提前致谢 :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是使用 表达式树 从两个输入表达式“构建”谓词表示谓词。
表达式树是一种使用 lambda 在树状结构(而不是直接委托)中生成代码表示的方法。这需要两个表示谓词的表达式树 (
Expression>
),并将它们组合成一个表示“or”情况(以及表达式中的“and”情况)的新表达式树。第二种方法)。表达式树及其相应的实用程序(如上面的内容)对于 ORM 之类的东西非常有用。例如,实体框架使用带有
IQueryable
的表达式树将定义为 lambda 的“代码”转换为在服务器上运行的 SQL。This is using Expression Trees to "build" a predicate from two input expressions representing predicates.
Expression Trees are a way to use lambda's to generate a representation of code in a tree like structure (rather than a delegate directly). This takes two expression trees representing predicates (
Expression<Func<T,bool>>
), and combines them into a new expression tree representing the "or" case (and the "and" case in the second method).Expression trees, and their corresponding utilities like above, are useful for things like ORMs. For example, Entity Framework uses expression trees with
IQueryable<T>
to turn "code" defined as a lambda into SQL that's run on the server.