简单的OData聚合在Entity Framework Core(SQL Sever)和Asp.Net Core上失败:
odata/file?$apply=groupby((FileType))
由于无法翻译使用过的GroupBy LINQ表达式警告,因此发出警告:
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.
然后引发异常:
system.security.verificationexception operation could destabilize the runtime
最相关的堆栈:
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()
使用的NuGet软件包版本:
显示问题的仓库:https://github.com/xmichaelx/ODataGroupByTest
在GitHub上的问题:https://github.com/OData/WebApi/issues/1578
我不确定问题出在哪里,EF Core是否应该能够将LINQ查询转换为有效的SQL或OData会导致难以转换GroupBy表达式。在解决之前,我正在寻找一些解决方法。
答案 0 :(得分:2)
使用对EF Core的Linq2Db扩展作为解决方法。
添加NuGet软件包后:
并且从
开始改变 public IActionResult Get()
{
return Ok(_db.Files);
}
到
public IActionResult Get()
{
return Ok(_db.Files.ToLinqToDB());
}
一切正常。
分支已修复:https://github.com/xmichaelx/ODataGroupByTest/tree/issue-workaround linq2db.EntityFrameworkCore:https://github.com/linq2db/linq2db.EntityFrameworkCore
编辑:求和,平均,最小,最大有效,countdistinct不起作用
答案 1 :(得分:-1)
我使用了 LinqToDb,这解决了聚合问题。 步骤:
这解决了聚合问题。 观察到的限制:带有聚合的 $filter(Contains) 不起作用,如果您使用分页 $top 也不起作用。