c# - 使用 AspNet Core OData 和 Entity Framework Core 与 GROUP BY 进行聚合

标签 c# asp.net-core odata entity-framework-core linq2db

Entity Framework Core (SQL Sever) 和 Asp.Net Core 上的简单 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 包版本:

  • 微软.AspNetCore.OData 7.0.1
  • Microsoft.EntityFrameworkCore.SqlServer 2.1.1
  • 微软.AspNetCore 2.1.2

repo 显示问题: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

编辑:sum、avg、min、max 有效,countdistinct 无效

关于c# - 使用 AspNet Core OData 和 Entity Framework Core 与 GROUP BY 进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51918056/

相关文章:

c# - 为什么这个按钮的 OnClick 事件只工作一次?

c# - OData 是公开非 CRUD API 的好方法吗?

c# - 需要在 Startup.cs 的 ConfigureServices 方法中获取站点 URL

asp.net-core - Asp.Net Core RC1 迁移到 RC2 后的问题

asp.net-core - ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

visual-studio-2013 - 自定义工具 'DataServicesCoreClientGenerator'失败。 ...错误0005 : The 'OpenType' attribute is not allowed

serialization - 是否有 EDM/OData 类型与 CLR 类型之间的映射器?

c# - 添加SqlParameter绑定(bind)LIKE '%@x%'

C# 合并两个具有重叠数据的列表

c# - 套接字性能 C++ 或 C#