在EF Core LINQ中使用字典< string,string>:.Any无法翻译

velaa5lx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(138)

在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();

hc2pp10m

hc2pp10m1#

不能在Where子句中使用转换后的属性。转换是在客户端进行的,EF不会将转换为SQL。
-@Gert Arnold在问题评论中
在调用.FirstOrDefaultAsync().ToDictionaryAsync().ToArrayAsync()等之后,您可以随时使用转换属性。这是因为调用任何.To或类似函数都会执行数据库查询,将任何后续LINQ操作转移到客户端而不是服务器端。
良好的经验法则;如果使用LINQ,并且有一个以Async结尾的函数,那么这些调用和它们的非LINQ对等体将执行数据库查询。

相关问题