entity-framework - 在循环中构建 LINQ 查询

标签 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。但是,这将转化为对数据库进行更加不必要的复杂查询,并且还会引入潜在的重复行,然后我需要对这些行进行重复数据删除。

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

谢谢

最佳答案

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

关于entity-framework - 在循环中构建 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50022713/

相关文章:

asp.net - 在asp.net中访问EF的继承实体

c# - 使用左连接 lambda 的 Entity Framework 加载数据

sql-server - 如何向我的 EF4 模型添加计算列?

Linq To 实体比较值与 List<int>

c# - 我应该使用 IQueryable 或 IEnumerable 中的哪一个来不将行放入内存?

entity-framework - 如何通过 Ninject 获取 UnitOfWork 中的 DbContext 实例?

LINQ 数据库调用次数

c# - 如何使用 LINQ 优化多个 if else

c# - 性能调整 Entity Framework 查询

c# - 将单个 LINQ 值转换为字符串