简单的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软件包版本:


Microsoft.AspNetCore.OData 7.0.1
Microsoft.EntityFrameworkCore.SqlServer 2.1.1
Microsoft.AspNetCore 2.1.2


回购显示问题:https://github.com/xmichaelx/ODataGroupByTest

在GitHub上发布:https://github.com/OData/WebApi/issues/1578

我不确定问题出在哪里,EF Core是否应该能够将LINQ查询转换为有效的SQL或OData会导致难以转换GroupBy表达式。在解决之前,我正在寻找一些解决方法。

最佳答案

使用对EF Core的Linq2Db扩展作为解决方法。

添加NuGet软件包后:


linq2db 2.2.0
linq2db.EntityFrameworkCore 1.0.1


并从

    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不起作用

10-04 18:49