【发布时间】:2017-09-12 10:58:20
【问题描述】:
我正在使用 .NetCore2.0 和 EntityFrameworkCore。
当我执行以下操作时:
Expression<Func<Foobar, bool>> predicate =
x =>
query.Foos.Any(a => a.Contains(x.Foo)) &&
query.Bars.Any(s => s.Contains(x.Bar));
var results = GetAll().AsQueryable().Where(predicate);
我在控制台中收到以下警告消息:
警告:Microsoft.EntityFrameworkCore.Query[200500] 无法翻译 LINQ 表达式“Any()”并将在本地进行评估。 警告:Microsoft.EntityFrameworkCore.Query[200500] 无法翻译 LINQ 表达式“where [a].Contains([x].Foo)”并将在本地进行评估 警告:Microsoft.EntityFrameworkCore.Query[200500] 无法翻译 LINQ 表达式“where [a].Contains([x].Bar)”,将在本地计算
查询本身确实有效并返回我正在寻找的内容,但是我想知道是否有办法避免这些警告或抑制它们
【问题讨论】:
-
什么是
query(和query.Foos、query.Bars)? -
@IvanStoev
query.Foos和query.Bars是字符串数组 -
好的。显然,这是当前 EFC 不支持的 SQL 转换之一。可以抑制警告,但请注意过滤将在内存中进行。避免它的唯一方法是用手动构建的基于
Or的表达式替换Any(...),我猜你不愿意这样做。 -
@IvanStoev 感谢您提供此信息。目前,我正在尝试使其可扩展以用于可能出现的更多选项。本质上,我希望它只在数组中有东西时应用
Contains()。否则,我只想让它全部返回,但我正在为此苦苦挣扎,我认为警告可能与它有关!谢谢。 -
你正在点击这个github.com/aspnet/EntityFrameworkCore/issues/8019。主要问题不是翻译,而谓词是表达式树,
Array.Any是 func 而不是表达式,因此 EF 无法检查并翻译它。
标签: c# entity-framework-core asp.net-core-2.0