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/