C# 组合表达式列表中的表达式

C# 组合表达式列表中的表达式,c#,dynamic,expression,C#,Dynamic,Expression,我想使用LINQtoSQL创建动态查询生成器 为此,我创建了我的界面,将每个动态条件添加到 List<Expression<Func<T,bool>>> 列表 界面看起来像: public interface IExpression<T> { IExpression<T> AddWhere(Expression<Func<T,bool>> whereCriteria); } 公共接口IExp

我想使用LINQtoSQL创建动态查询生成器

为此,我创建了我的界面,将每个动态条件添加到

List<Expression<Func<T,bool>>>
列表
界面看起来像:

public interface IExpression<T>
{
    IExpression<T> AddWhere(Expression<Func<T,bool>> whereCriteria);    
}
公共接口IExpression
{
i表达式AddWhere(表达式whereCriteria);
}
现在,我想组合列表中的所有表达式,构造带有“and”条件的where子句并执行查询

我试着组合表达式,但没有成功


有人能帮忙吗?或者请建议其他选择。

最简单的方法是使用PredicateBuilder:

基本上,您所要做的就是使用这个helper类:

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;

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);
  }
}
使用系统;
使用System.Linq;
使用System.Linq.Expressions;
使用System.Collections.Generic;
公共静态类谓词生成器
{
公共静态表达式True(){return f=>True;}
公共静态表达式False(){return f=>False;}
公共静态表达式或(此表达式expr1,
表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters);
}
公共静态表达式和(此表达式expr1,
表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.AndAlso(expr1.Body,invokedExpr),expr1.Parameters);
}
}
然后你可以这样使用它:

  public static Expression<Func<Product, bool>> ContainsInDescription (
                                                params string[] keywords)
  {
    var predicate = PredicateBuilder.False<Product>();
    foreach (string keyword in keywords)
    {
      string temp = keyword;
      predicate = predicate.Or (p => p.Description.Contains (temp));
    }
    return predicate;
  }
公共静态表达式包含描述(
参数字符串[]关键字)
{
var predicate=PredicateBuilder.False();
foreach(关键字中的字符串关键字)
{
字符串temp=关键字;
谓词=谓词。或(p=>p.Description.Contains(temp));
}
返回谓词;
}
(代码和示例都取自上面的链接,我只是在这里发布了它,以防链接有时不起作用)


由于您的接口不使用泛型,您的特定场景有点复杂。您能否再多展示一些相关代码,以便我可以帮助您更好地根据您的实际需要定制此解决方案?

谢谢您的回复。我正在调查提供的链接。我的接口使用泛型。我已经修改过了。@user2249600:好吧,如果是这样的话,那应该是一个简单的复制粘贴问题。请注意,当您
处理值时,应该使用
PredicateBuilder.True()初始化谓词了不起的发现!我不明白这是怎么回事。在