使用实体框架返回人名列表,其中人名包含字符串数组中的文本。
比方说:
string[] search = new string[] { "bert", "rob" };
和查询
dataContext.People.Where(w => search.Any(a => w.Forename.Contains(a)));
这将编译并运行,但是该过程实际上是从数据库中调用所有记录,然后对返回的数据执行我的where子句。这是有道理的。
有没有一种方法可以重写查询,以便在SQL中生成where子句?
我假设dataContext.People是IQueryable来自的,DbSet并且不涉及实现的指令,例如ToList()或AsEnumerable()。
IQueryable
DbSet
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);