【问题标题】:Entity Framework Query using Contains with mulitple options使用包含多个选项的实体框架查询
【发布时间】:2017-10-08 00:42:08
【问题描述】:

使用实体框架返回姓名包含字符串数组中的文本的人员列表。

假设:

string[] search = new string[] { "bert", "rob" };

查询

dataContext.People.Where(w => search.Any(a => w.Forename.Contains(a)));

这编译并工作,但该过程实际上是从数据库中调用所有记录,然后对返回的数据执行我的 where 子句。这是有道理的。

有没有办法重写查询,以便在 SQL 中生成 where 子句?

【问题讨论】:

标签: sql sql-server entity-framework entity-framework-core


【解决方案1】:

我假设 dataContext.People 是来自 DbSetIQueryable,并且不涉及具体化指令,例如 ToList()AsEnumerable()

答案在这里:http://www.albahari.com/nutshell/predicatebuilder.aspx

在你的情况下:

var predicate = PredicateBuilder.False<People>();

foreach (string keyword in keywords)
{
    string temp = keyword;
    predicate = predicate.Or (p => p.Forename.Contains (temp));
}
dataContext.People.Where (predicate);

【讨论】:

  • 这如何强制 EF 在从数据库中获取记录之前通过 WHERE 子句限制结果?
  • 因为这适用于 IQueryable,并且在访问数据库之前将被转换为原始 sql。这就是创建 PredicateBuilder 的原因。
  • 对实体核心进行了小调整,但很有效,谢谢
  • 这是金!谢谢!
【解决方案2】:

一种方法是使用SqlQuery 并执行实际的 SQL 查询。

dataContext.Database.SqlQuery<People>("SELECT Forename, Lastname FROM myTable WHERE Forename LIKE '%bert%' or Forename LIKE '%rob%'");

【讨论】:

  • 现在我们可以讨论在应用程序中使用 未参数化 sql 查询使用允许预编译查询的 ORM :) ...
  • @tschmit007 所以你是说 EF 5 不应该引入 SqlQuery?
  • 在我看来,是的,他们不应该这样做。那就是说我不时使用它。但在这种情况下,还有另一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2012-01-05
相关资源
最近更新 更多