Entity Framework Core 具有多个值的 where 子句

Dil*_*hod 8 c# linq entity-framework-core

我有一个表 Person,字段很少。我想在一次通话中从数据库中找到多个人,而不需要使用大量的“OR”。当我尝试以下查询时,我收到此错误。

var list = new List<string>(){"John", "Adam", "Bill", "David"};
context.People.Where(p=>list.Any(l=>l == p.Name)).ToList();
Run Code Online (Sandbox Code Playgroud)

错误信息:

System.InvalidOperationException:“无法翻译 LINQ 表达式 'DbSet .Where(p => __list_0 .Any(l => l == p.Name))”。以可翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端计算。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=2101038

我想我的查询无法翻译,但是还有其他方法吗?

提前致谢!

bra*_*ry9 9

解决方案是使用一个可以翻译成 SQL 的函数,

var list = new List<string>(){"John", "Adam", "Bill", "David"};
var matchingPeople = context.People.Where(p=>list.Contains(p.Name)).ToList();
Run Code Online (Sandbox Code Playgroud)

List<string>.Contains()翻译成SQL IN (values)语句。

注意:正如 @MongZhu 指出的那样,在 Entity Framework Core 3.0 中,该翻译存在错误IEnumerable.Contains(),必须改为使用。该错误已在 3.1 中解决