实体框架核心where子句具有多个值

时间:2020-07-15 09:18:50

标签: c# linq entity-framework-core

我有一个桌子人是几个字段。我想在一次呼叫中从数据库中找到多个人,而无需放置很多“ OR”。当我尝试以下查询时,出现此错误。

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

错误消息:

System.InvalidOperationException:'LINQ表达式'DbSet 哪里(p => __list_0 .Any(l => l == p.Name))'无法翻译。以可以翻译的形式重写查询,或切换到 通过插入对其中任何一个的调用来明确评估客户 AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()。看到 https://go.microsoft.com/fwlink/?linkid=2101038了解更多信息。'

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

谢谢!

2 个答案:

答案 0 :(得分:3)

该解决方案使用的功能可以转换为SQL,

load_workbook(xl_path, data_only = True)

var list = new List<string>(){"John", "Adam", "Bill", "David"}; var matchingPeople = context.People.Where(p=>list.Contains(p.Name)).ToList(); 被翻译成SQL List<string>.Contains()语句。

注意:正如@MongZhu所指出的那样,在Entity Framework Core 3.0 there is a bug中,必须使用翻译和 IN (values)。该错误已在3.1中解决

答案 1 :(得分:1)

您是否尝试将.Any()替换为.Contains()?像这样:

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