【发布时间】:2012-06-14 17:08:52
【问题描述】:
我发现了以下可以组合多个Expression<Func<T,bool>>表达式的问题:
How to merge two C# Lambda Expressions without an invoke?
我想知道如何使用类似的技术将 .OrderBy Expression<Func<Entity, Key>> 与 .Where Expression<Func<Entity, bool>> 合并为一个类型表达式,或从类型继承 System.Linq.Expressions.Expression。
我正在制作一个非常精简的 QueryProvider 样式类,用于通过公共方法 .Where 和 .OrderBy 获取 T => T == ... Func。这是为了将此类构建的表达式传递给 QueryTranslator 以创建合适的 SQL。
这种风格的 QueryTranslator,当从 QueryProvider 调用时,通常将 System.Linq.Expressions.Expression 作为参数,然后将其转换为 SQL。
我可以理解并理解上述合并两个.Where Funcs 的问题。以下博客文章对此特别有用,我跟踪了每个示例:
http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx
这篇 CodeProject 文章也很有用:
http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C
当将 .OrderBy Func 与 .Where Func 组合时,两者具有不同的通用参数。在 .Where 的情况下是 Func<Entity, bool>,在 .OrderBy 的情况下是 Func<Entity, Key>。
从表面上看,合并这两个表达式并不像合并两个具有相同通用参数的表达式那么简单。
内置的 Func-Expression-production-engine(不确定确切的术语)能够将 .Where Func 与 .OrderBy Func 结合起来。我很好奇当这两个表达式合并为一个System.Linq.Expressions.Expression 时会发生什么。有可能吗,如果可以,假设每个表达式中的实体类型相同,您将如何将 Expression<Func<Entity, bool>> 与 Expression<Func<Entity,Key>> 组合?
【问题讨论】:
-
生成的表达式应该是什么样子?
-
应该和.Where(T=>T.Name=="Cooper").OrderBy(T=>T.DateOfBirth)一样
-
您将
.Where(x => condition1).Where(x => condition2)合并到.Where(x => condition1 && condition),但您不能以同样的方式合并.Where(x => condition).OrderBy(x => value)。那么,再一次,结果表达式应该是什么样子?queryable.Where(x => condition).OrderBy(x => value)不返回表达式,它返回IQueryable<T>。 -
不知道为什么这个问题被投票这么多。就目前而言,它没有意义,而且定义不足。
-
道歉。更新了问题以提高清晰度。这里的 .Where 和 .OrderBy 总是与调用 .Where(Expression
>) 或 .OrderBy(Expression ) 时创建的表达式相关。这是关于组合调用这些方法后创建的表达式。
标签: c# linq expression linq-expressions