C# 使用AspNet Core OData和实体框架Core与组聚合

C# 使用AspNet Core OData和实体框架Core与组聚合,c#,asp.net-core,odata,entity-framework-core,linq2db,C#,Asp.net Core,Odata,Entity Framework Core,Linq2db,实体框架核心(SQL Server)和Asp.Net核心上的简单OData聚合失败: odata/file?$apply=groupby((FileType)) 由于无法翻译使用过的GroupBy LINQ表达式,因此发出警告: Microsoft.EntityFrameworkCore.Query: Warning: The LINQ expression 'GroupBy(new GroupByWrapper() {GroupByContainer = new LastInChain()

实体框架核心(SQL Server)和Asp.Net核心上的简单OData聚合失败:

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
显示发行情况的回购协议:

关于GitHub的问题:


我不确定问题在哪里,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);
    }

一切正常

具有修复的分支: linq2db.EntityFrameworkCore:


编辑:总和、平均值、最小值、最大值有效,countdistinct不起作用

我使用了LinqToDb,这解决了聚合问题。 步骤:

  • 安装包:Linq2Db.EntityFrameworkCore
  • 在数据提供程序中使用:使用LinqToDb.Entityframeworkcore
  • 在数据库查询中添加-ToLinqToDb() 这解决了总体问题。 观察到的限制:$filter(Contains)和aggregate不起作用,如果使用分页$top也不起作用

        public IActionResult Get()
        {
            return Ok(_db.Files.ToLinqToDB());
        }