【问题标题】:EF core query could not be translated无法翻译 EF 核心查询
【发布时间】: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 =&gt; searchKeys.Contains(key.Name, searchKey))是否可以翻译?
  • @mu88 您的代码在语法上是错误的。因为Contains 方法获取值和比较器。但是我尝试了_dbContext.Keys.Where(key =&gt; searchKeys.Any(searchKey =&gt; key.Name.Contains(searchKey))),但它也不起作用(尽管它也不能解决我的问题)。
  • 抱歉代码错误,我的意思是dbContext.Keys.Where(key =&gt; searchKeys.Contains(key.Name))。我知道LIKE 还是不见了,只是为了有个起点。

标签: c# entity-framework wildcard sql-like


【解决方案1】:

所以以下解决方案至少应该有效:

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&lt;Func&lt;Key, bool&gt;&gt;,它基本上会产生以下结果:.Where(k =&gt; EF.Functions.Like(k.Name, searchKey[0]) || ... || EF.Functions.Like(k.Name, searchKey[5]))

【讨论】:

  • 虽然您的解决方案没有解决“EF核心查询无法翻译”的问题,但它很好地解决了我的问题。非常感谢。
  • 当然,很高兴为您提供帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2021-06-23
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多