在循环

时间:2018-04-25 12:43:49

标签: entity-framework linq linq-to-entities

我有一个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);
}

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

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

由于

2 个答案:

答案 0 :(得分:0)

你需要使用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

答案 1 :(得分:0)

您可以使用System.Linq.Dynamic package available on Nuget。您还可以关注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的建议使用谓词构建器。