Sql 使用包含多个选项的实体框架查询
使用实体框架返回姓名包含字符串数组中文本的人员列表 比如说:Sql 使用包含多个选项的实体框架查询,sql,sql-server,entity-framework,entity-framework-core,Sql,Sql Server,Entity Framework,Entity Framework Core,使用实体框架返回姓名包含字符串数组中文本的人员列表 比如说: string[] search = new string[] { "bert", "rob" }; 和查询 dataContext.People.Where(w => search.Any(a => w.Forename.Contains(a))); 这可以编译并工作,但该过程实际上是从数据库调用所有记录,然后对返回的数据执行my where子句。这是有道理的 有没有办法重写查询以便在SQL中生成where子句 一种方
string[] search = new string[] { "bert", "rob" };
和查询
dataContext.People.Where(w => search.Any(a => w.Forename.Contains(a)));
这可以编译并工作,但该过程实际上是从数据库调用所有记录,然后对返回的数据执行my where子句。这是有道理的
有没有办法重写查询以便在SQL中生成where子句 一种方法是使用并执行实际的SQL查询
dataContext.Database.SqlQuery<People>("SELECT Forename, Lastname FROM myTable WHERE Forename LIKE '%bert%' or Forename LIKE '%rob%'");
dataContext.Database.SqlQuery(“从myTable中选择名字、姓氏,其中名字类似“%bert%”或名字类似“%rob%”);
我假设dataContext.People是来自DbSet
的IQueryable
,并且不涉及任何具体化指令,例如ToList()
或AsEnumerable()
答案如下:
就你而言:
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);
var predicate=PredicateBuilder.False();
foreach(关键字中的字符串关键字)
{
字符串temp=关键字;
谓词=谓词。或(p=>p.Forename.Contains(temp));
}
dataContext.People.Where(谓词);
这如何强制EF在从数据库获取记录之前通过WHERE子句限制结果?因为这在IQueryable上起作用,并且在命中db之前会转换为原始sql。这就是创建PredicateBuilder的原因。对实体核心进行了一些小调整,但效果很好,谢谢。这真是太棒了!非常感谢。现在我们可以讨论在使用ORM的应用程序中使用非参数化sql查询,允许预编译查询:)…@tschmit007所以你是说EF 5不应该引入SqlQuery?在我看来,是的,不应该。也就是说我经常使用它。但在这种情况下,还有另一种方法。这个链接可能会有所帮助