C# 运行查询时出现Microsoft.EntityFrameworkCore.Query警告

C# 运行查询时出现Microsoft.EntityFrameworkCore.Query警告,c#,entity-framework-core,asp.net-core-2.0,C#,Entity Framework Core,Asp.net Core 2.0,我正在使用.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

我正在使用.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);
表达式谓词=
x=>
query.Foos.Any(a=>a.Contains(x.Foo))&&
Any(s=>s.Contains(x.Bar));
var results=GetAll().AsQueryable().Where(谓词);
我在控制台中收到以下警告消息:

警告:Microsoft.EntityFrameworkCore.Query[200500] 无法翻译LINQ表达式“Any()”,将在本地对其求值。 警告:Microsoft.EntityFrameworkCore.Query[200500] 无法转换LINQ表达式“其中[a].Contains([x].Foo)”,将在本地对其求值 警告:Microsoft.EntityFrameworkCore.Query[200500] 无法转换LINQ表达式“其中[a].Contains([x].Bar)”,将在本地对其求值


查询本身可以工作并返回我正在查找的内容,但是我想知道是否有办法在我们的系统上避免或抑制这些警告,启用此错误是我们深思熟虑的决定,是通过配置DbContextOptions Builder完成的。我将粘贴我们如何打开它,以便您可以找到它在您的系统中的位置:

            services.AddDbContext<FooContext>(options =>
                options.UseSqlServer(BarConnectionString,
                    sqlServerOptions => sqlServerOptions.CommandTimeout(300)).UseLazyLoadingProxies()
                                  .ConfigureWarnings(warnings =>
                                  warnings.Throw(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.QueryClientEvaluationWarning))
                    );
services.AddDbContext(选项=>
选项。使用SQLServer(BarConnectionString,
sqlServerOptions=>sqlServerOptions.CommandTimeout(300)).UseLazyLoadingProxies()
.ConfigureWarnings(警告=>
warnings.Throw(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.QueryClientEvaluationWarning))
);

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

什么是
query
(和
query.Foos
query.bar
)?@IvanStoev
query.Foos
query.bar
是字符串数组OK。显然,这是当前EFC不支持的SQL翻译之一。可以抑制警告,但请注意,过滤将在内存中进行。避免这种情况的唯一方法是用手动构建的
或基于
的表达式替换
任何(…)
,我想这是您不愿意做的。@IvanStoev感谢您提供的信息。目前,我正试图使其可扩展,以提供可能出现的更多选项。本质上,我希望它只在数组中有内容时应用
Contains()
。否则,我只想让它全部返回,但我正在为此而挣扎,我认为警告可能与此有关!谢谢。你打这个了。不翻译的主要问题是,当谓词是表达式树时,
数组。Any
是func而不是表达式,因此EF无法检查并翻译它。