Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用包含多个选项的实体框架查询_Sql_Sql Server_Entity Framework_Entity Framework Core - Fatal编程技术网

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?在我看来,是的,不应该。也就是说我经常使用它。但在这种情况下,还有另一种方法。这个链接可能会有所帮助