L'aggregazione OData semplice non riesce su Entity Framework Core (SQL Sever) e Asp.Net Core:
odata/file?$apply=groupby((FileType))
A causa dell'impossibilità di tradurre, viene emesso un avviso di espressione GroupBy LINQ usato:
Microsoft.EntityFrameworkCore.Query: Warning: The LINQ expression 'GroupBy(new GroupByWrapper() {GroupByContainer = new LastInChain() {Name = "FileType", Value = [$it].FileType}}, [$it])' could not be translated and will be evaluated locally.
E poi viene lanciata un'eccezione:
system.security.verificationexception operation could destabilize the runtime
pila più rilevante:
at lambda_method(Closure , File )
at System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.GroupedEnumerable`3.GetEnumerator()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
Utilizzate le versioni dei pacchetti NuGet:
Repo che mostra il problema: https://github.com/xmichaelx/ODataGroupByTest
Problema su GitHub: https://github.com/OData/WebApi/issues/1578
Non sono sicuro di dove si trova il problema, se EF Core dovrebbe essere in grado di convertire la query LINQ in SQL valido o OData genera una conversione dell'espressione GroupBy difficile. Finché non viene risolto, sto cercando qualche soluzione.
Usa estensioni Linq2Db su EF Core come soluzione alternativa.
Dopo aver aggiunto i pacchetti NuGet:
E passando da
public IActionResult Get()
{
return Ok(_db.Files);
}
a
public IActionResult Get()
{
return Ok(_db.Files.ToLinqToDB());
}
tutto funziona.
Filiale con correzione: https://github.com/xmichaelx/ODataGroupByTest/tree/issue-workaround linq2db.EntityFrameworkCore: https://github.com/linq2db/linq2db.EntityFrameworkCore
EDIT: sum, avg, min, max works, countdistinct non funziona