c# - 在 Entity Framework Core 的 Linq 查询中使用本地函数
问题描述
我在 Entity Framework Core 中编写了 Linq 查询,如下所示:
Func<decimal, decimal, decimal, decimal, decimal> f = (a, b, c, d) => a + b + c + d;
var result = dbcontext.DailyStats
.Where(p => p.Year == 2020)
.Sum(p => f(p.field1, p.field2, p.field3, p.field4))
但是,这给出了以下例外:
System.InvalidOperationException: '无法翻译 LINQ 表达式'Invoke(__f_1, [EntityShaperExpression].field1, [EntityShaperExpression].field2, [EntityShaperExpression].field3, [EntityShaperExpression].field4)'。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。
我该如何解决这个问题?
解决方案
实际上,如果您查看Sum
期望的输入参数,您会看到:Expression<Func<YouDataTable, int?>> selector
. 因此,让我们构建其中之一:
Expression<Func<DailyStat, int?> f = (p) => p.field1 + p.field2 + p.field3 + p.field4;
现在您只需要将 传递给f
Sum 函数。无需调用,会自动调用:
var result = dbcontext.DailyStats
.Where(p => p.Year == 2020)
.Sum(f);
这就是翻译后的 sql 的样子(我稍微更改了列名,因为我在我的机器上对其进行了测试,而且我只使用了 3 列)
SELECT SUM([t0].[col1] + [t0].[col2] + [t0].[col3]) AS [value]
FROM [myTable] AS [t0]
WHERE DATEPART(Year, [t0].[timestamp]) = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [2020]
推荐阅读
- git - Jenkins Pipeline 从 git commit 获取变量
- polymer-3.x - 聚合物 3 - 缺少装饰器
- android - Android Logcat 奇怪的行为
- ruby-on-rails - 在活动管理员中禁用特定模型的缓存
- node.js - 通过基于嵌套和子嵌套文档的过滤器选择一个字段,例如使用 mongo 的 Post->Comment->Likes
- bash - 组合多个 bash 脚本
- php - 根据列值获取正确的行
- .net-core - EF Core 3.0 附加文件映射和更新
- javascript - 如何在一周内获得第二天
- r - `format` 对 UTF-8 字符串有什么作用?