Sto usando .NetCore2.0 e EntityFrameworkCore.
Quando eseguo quanto segue:
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);
Ricevo i seguenti messaggi di avviso nella mia console:
warn: Microsoft.EntityFrameworkCore.Query [200500] L'espressione LINQ 'Any ()' non può essere tradotta e verrà valutata localmente. warn: Microsoft.EntityFrameworkCore.Query [200500] L'espressione LINQ 'where [a] .Contains ([x] .Foo)' non può essere tradotta e verrà valutata localmente warn: Microsoft.EntityFrameworkCore.Query [200500] L'espressione LINQ 'dove [a] .Contains ([x] .Bar)' non può essere tradotto e verrà valutato localmente
La query stessa funziona e restituisce ciò che sto cercando, tuttavia mi chiedevo se c'era un modo per evitare questi avvisi o per eliminarli
Sul nostro sistema, abilitare questo errore è stata una decisione deliberata da parte nostra ed è stata fatta configurando dbContextOptionsBuilder. Incollerò il modo in cui l'abbiamo acceso in modo da poter trovare dove deve trovarsi nel tuo sistema:
services.AddDbContext<FooContext>(options =>
options.UseSqlServer(BarConnectionString,
sqlServerOptions => sqlServerOptions.CommandTimeout(300)).UseLazyLoadingProxies()
.ConfigureWarnings(warnings =>
warnings.Throw(Microsoft.EntityFrameworkCore.Diagnostics.RelationalEventId.QueryClientEvaluationWarning))
);
Si noti che questo è in realtà qualcosa di utile in quanto segnala che la query non verrà eseguita interamente sul server, quindi potrebbe essere un problema di prestazioni.