无法翻译 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]))
.
我正在尝试开发一些需要以下复杂查询的动态代码 运行。
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]))
.