EF核心查询无法翻译



我正在尝试开发一些需要以下复杂查询才能运行的动态类型的代码。

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%];

那么我想查找例如名称为CCD_ 1或名称为CCD_
但是ef cores说它无法翻译,并建议要么编写一个可翻译的查询,要么在客户端中进行查询(这在我的问题中不合适)。

系统。InvalidOperationException:LINQ表达式"DbSet()".其中(k=>__searchKeys_0.Any(searchKey=>__Functions_1。喜欢(matchExpression:k.名称,pattern:searchKey)))'无法翻译。以可翻译的形式重写查询,或者切换到客户端通过插入对"AsEnumerable"、"AsAsyncEnumerable"、"ToList"或"ToListAsync"的调用显式求值。看见https://go.microsoft.com/fwlink/?linkid=2101038了解更多信息。

所以我想将查询更改为可翻译的查询,但我不知道问题出在哪里,也没有开始修复的线索。

因此,以下解决方案至少应该有效:

var searchKeys = search.KeySearch.Split(',').Select(key => key.Trim());
var queries = new List<IQueryable<Key>>();
foreach (var searchKey in searchKeys)
{
queries.Add(_dbContext.Keys.Where(k => EF.Functions.Like(k.Name, searchKey)));
}
var finalQuery = queries[0];
for (var i = 1; i < queries.Count; i++)
{
finalQuery = finalQuery.Union(queries[i]);
}
var filteredKeys = finalQuery.ToList();

我认为该代码非常低效,因为它将导致多个UNION语句。

一个更高性能的选择是构建一个表达式树Expression<Func<Key, bool>>,它基本上产生以下结果:.Where(k => EF.Functions.Like(k.Name, searchKey[0]) || ... || EF.Functions.Like(k.Name, searchKey[5]))

最新更新