首页 > 解决方案 > 在 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

我该如何解决这个问题?

标签: c#linqentity-framework-core

解决方案


实际上,如果您查看Sum期望的输入参数,您会看到:Expression<Func<YouDataTable, int?>> selector. 因此,让我们构建其中之一:

Expression<Func<DailyStat, int?> f = (p) => p.field1 + p.field2 + p.field3 + p.field4;

现在您只需要将 传递给fSum 函数。无需调用,会自动调用:

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]

推荐阅读