在EF Core中的LINQ查询中使用.Any
有什么技巧吗?f.Filters
的类型为Dictionary<string, string>
var items = await _dbContext.MyItems
.Where(f => f.ID == 1)
.Where(f => f.Filters.Keys.Any( k => k == "My Key"))
.ToListAsync();
字符串
当我运行这个,我得到:
LINQ表达式
DbSet<MyItems>()
.Where(f => f.ID == 1)
.Where(f => f.Filters.Keys
.Any())
型
无法翻译。请以可翻译的形式重写查询,或切换到客户端评估
通过插入对AsEclock()、AsAsAsyncEclock()、ToList()或ToListAsync()的调用来显式地调用。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。
我尝试添加AsEnumerable
作为文档状态,但这似乎没有什么区别:
IE:
var items = await _dbContext.MyItems
.Where(f => f.ID == 1)
.Where(f => f.Filters.Keys.AsEnumerable().Any( k => k == "My Key"))
.ToListAsync();
型
1条答案
按热度按时间hc2pp10m1#
不能在
Where
子句中使用转换后的属性。转换是在客户端进行的,EF不会将转换为SQL。-@Gert Arnold在问题评论中
在调用
.FirstOrDefaultAsync()
、.ToDictionaryAsync()
或.ToArrayAsync()
等之后,您可以随时使用转换属性。这是因为调用任何.To
或类似函数都会执行数据库查询,将任何后续LINQ操作转移到客户端而不是服务器端。良好的经验法则;如果使用LINQ,并且有一个以
Async
结尾的函数,那么这些调用和它们的非LINQ对等体将执行数据库查询。