在循环中构建 LINQ 查询

Build LINQ query in a loop

我有一个 LINQ 查询(将针对 DbContext 执行),我首先使用我事先知道的一些条件进行构建。

var r = from p in db.People
        where blah
        select p;

然后我有一堆搜索条件,以数组 (string[]) 的形式提供。如果我想做一个 AND,这很简单:

foreach (string s in searchParameters)
{
      r = from r1 in r
          where r1.field == s
          select r1;
}

但是,我现在需要以 OR 方式使用这些参数。一种解决方案是执行以下操作:

var results = new List<IEnumerable<RowType>>();
foreach (string s in searchParameters)
{
      var r2 = from r1 in r
          where r1.field == s
          select r1;
      results.Add(r2);
}

然后,最后,对 "results" 中的所有条目执行 UNION。但是,这将转化为对数据库的更加不必要的复杂查询,并且还会引入可能重复的行,然后我需要删除这些行。

是否有一种简单有效的方法来实现我想要做的事情?

谢谢

您需要使用 PredicateBuilder,如果我没看错,您正在进行单一查询并且您需要其中的条件

IQueryable<Product> SearchProducts (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 dataContext.Products.Where (predicate);
}

Dynamically Composing Expression Predicates

您可以使用 System.Linq.Dynamic package available on Nuget. You can also follow this guide 了解如何使用该软件包。

对于您的情况,我认为查询可能是:

var query = IQueryable<DataType>();
foreach(string parameter in searchParameters)
{
   query = query.Where("fieldName ==" + parameter );
}

// call the LINQ query at the end when all the conditions are built
var results = query.Select(q => q.field).ToList();

这可能适用于您的情况,否则您可以按照 Pranay 的建议使用谓词构建器。