【问题标题】:Microsoft.EntityFrameworkCore.Query Warning when running queryMicrosoft.EntityFrameworkCore.Query 运行查询时出现警告
【发布时间】: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.Foosquery.Bars)?
  • @IvanStoev query.Foosquery.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


【解决方案1】:

在我们的系统上,启用此错误是我们深思熟虑的决定,是通过配置 dbContextOptionsBuilder 完成的。我将粘贴我们如何打开它,以便您可以找到它必须在您的系统中的位置:

            services.AddDbContext<FooContext>(options =>
                options.UseSqlServer(BarConnectionString,
                    sqlServerOptions => sqlServerOptions.CommandTimeout(300)).UseLazyLoadingProxies()
                                  .ConfigureWarnings(warnings =>
                                  warnings.Throw(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.QueryClientEvaluationWarning))
                    );

请注意,这实际上很有用,因为它表明您的查询不会完全在服务器上运行,因此可能是性能问题。

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2018-03-11
    • 2019-06-15
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多