【问题标题】:Aggregation with GROUP BY using AspNet Core OData and Entity Framework Core使用 AspNet Core OData 和 Entity Framework Core 与 GROUP BY 进行聚合
【发布时间】:2019-01-25 20:01:33
【问题描述】:

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 包版本:

  • 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 表达式。在解决之前,我正在寻找一些解决方法。

【问题讨论】:

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


    【解决方案1】:

    使用 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 无效

    【讨论】:

      【解决方案2】:

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

      1. 安装包:Linq2Db.EntityFrameworkCore
      2. 在您的数据提供程序中使用:使用 LinqToDb.Entityframeworkcore
      3. 在您的数据库查询中添加 - ToLinqToDb();

      这解决了聚合问题。 观察到的限制:$filter(Contains) with aggregate 不起作用,如果您使用分页 $top 也不起作用。

      【讨论】:

        猜你喜欢
        • 2020-05-17
        • 1970-01-01
        • 2022-01-18
        • 2020-08-23
        • 1970-01-01
        • 2012-09-20
        • 2017-05-11
        • 2014-11-22
        • 1970-01-01
        相关资源
        最近更新 更多