5

我发现以下可以组合多个Expression<Func<T,bool>>表达式的问题:

如何在没有调用的情况下合并两个 C# Lambda 表达式?

我想知道是否使用类似的技术将 .OrderByExpression<Func<Entity, Key>>与 .Where合并Expression<Func<Entity, bool>>到一个类型的表达式中,或者从类型继承,System.Linq.Expressions.Expression.

我正在制作一个非常精简的 QueryProvider 风格的类,用于T => T == ...通过公共方法.Where.OrderBy. 这是为了将此类构建的表达式传递给 QueryTranslator 以创建合适的 SQL。

这种风格的 QueryTranslator 在从 QueryProvider 调用时,通常将一个System.Linq.Expressions.Expression作为参数,然后将其转换为 SQL。

我可以理解并理解上述合并两个.WhereFuncs 的问题。以下博客文章对此特别有用,我跟踪了每个示例:

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 的情况下是 a Func<Entity, bool>,在 .OrderBy 的情况下是 a Func<Entity, Key>

从表面上看,合并这两个表达式并不像合并两个具有相同通用参数的表达式那么简单。

内置的 Func-Expression-production-engine(不确定确切的术语)能够将 .Where Func 与 .OrderBy Func 结合起来。当这两个表达式合并为一个时,我很好奇引擎盖下会发生什么System.Linq.Expressions.Expression。是否有可能,如果是这样,您将如何将 anExpression<Func<Entity, bool>>Expression<Func<Entity,Key>>假设 Entity 在每个表达式中的类型相同?

4

2 回答 2

3
public IQueryable<T> ApplyExpressions<T, TKey>(
  Expression<Func<T, TKey>> sortBy,
  Expression<Func<T, bool>> filterBy,
  IQueryable<T> source)
{
  return source.Where(filterBy).OrderBy(sortBy);
}


IQueryable<Customer> query = ApplyExpressions<Customer, int>(
  c => c.Age,
  c => c.Name.StartsWith("B"),
  myDC.Customers)

Expression queryExpression = query.Expression;  //tada
于 2012-06-14T19:28:25.417 回答
0

我认为这个问题之所以模棱两可,是因为它有点无法回答。

我正在尝试构建一个超级表达式,例如IQueryable<>表达式构建器如何在一个表达式中使用.Where.OrderBy表达式。

但是,如果没有主题,我对表达式和表达式树的有限理解似乎表明这是不可能的。

要将.Where表达式与.OrderBy表达式组合成一个表达式,您需要 MethodCallExpression' 来分隔两个LambdaExpressions。

MethodCallExpression需要一个主题来调用方法。这是IQueryable<>使用的地方。

我已经更改了我的 Query 类以保持所有的LambdaExpression' 分开,然后将它们分别传递给 QueryTranslator。QT 将输出 SQL 合并到正确的位置。

这与分析一个超级表达式并根据表达式中的 's 将 IQueryable<>SQL 输出到正确位置的 QueryProvider 不同。MethodCallExpression

于 2012-06-15T16:31:23.637 回答