无法翻译 EF 核心查询

EF core query could not be translated

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

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 的行。例如,如果我有这样的搜索键:

var searchKeys = ["name_%", "last_x%];

然后我想查找名称为 name_alex 或名称为 last_xaka 的行。
但是 ef cores 说它无法翻译并建议编写可翻译的查询或在客户端中执行查询(这不适合我的问题)。

System.InvalidOperationException: The LINQ expression 'DbSet() .Where(k => __searchKeys_0 .Any(searchKey => __Functions_1 .Like( matchExpression: k.Name, pattern: searchKey)))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

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

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

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])).