【发布时间】:2021-05-28 20:56:50
【问题描述】:
我正在尝试开发一些需要运行以下复杂查询的动态类型的代码。
IEnumerable<string> searchKeys = search.KeySearch.Split(',').Select(key => key.Trim());
var searchedIds = _dbContext.Keys
.Where(key => searchKeys.Any(searchKey => EF.Functions.Like(key.Name, searchKey)))
实际上我想找到包含其中一个 searchKeys 的行。例如,如果我有这样的 searchKeys:
var searchKeys = ["name_%", "last_x%];
然后我想查找名称为name_alex 或名称为last_xaka 的行。
但是 ef cores 说它无法翻译,并建议编写可翻译的查询或在客户端执行查询(这不适合我的问题)。
System.InvalidOperationException:LINQ 表达式 'DbSet() .Where(k => __searchKeys_0 .Any(searchKey => __Functions_1 。喜欢( 匹配表达式:k.Name, 模式:searchKey)))' 无法翻译。要么以可翻译的形式重写查询,要么切换到客户端 通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。
所以我想将查询更改为可翻译的查询,但我不知道问题出在哪里,也没有开始修复它的线索。
【问题讨论】:
-
您好,尝试编写SQL并使用方法_dbContext.Keys.FromSqlRaw(...)
-
感谢@MartinGluch 的解决方案。我会试试这个,但我认为如果我可以使用 LINQ 修复它会很好。
-
请问
dbContext.Keys.Where(key => searchKeys.Contains(key.Name, searchKey))是否可以翻译? -
@mu88 您的代码在语法上是错误的。因为
Contains方法获取值和比较器。但是我尝试了_dbContext.Keys.Where(key => searchKeys.Any(searchKey => key.Name.Contains(searchKey))),但它也不起作用(尽管它也不能解决我的问题)。 -
抱歉代码错误,我的意思是
dbContext.Keys.Where(key => searchKeys.Contains(key.Name))。我知道LIKE还是不见了,只是为了有个起点。
标签: c# entity-framework wildcard sql-like