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