gpt4 book ai didi

c# - 如何使用 ef 核心发送 Func 类型的变量以从 IQueryable 求和

转载 作者:行者123 更新时间:2023-12-05 01:50:01 25 4
gpt4 key购买 nike

我需要在函数参数中发送一个lamda但是当我这样做时我有错误说

Expression of type 'System.Func2[KokazGoodsTransfer.Models.Receipt,System.Decimal]' cannot be used for parameter of type 'System.Linq.Expressions.Expression1[System.Func2[KokazGoodsTransfer.Models.Receipt,System.Decimal]]' of method 'System.Decimal Sum[Receipt](System.Linq.IQueryable1[KokazGoodsTransfer.Models.Receipt], System.Linq.Expressions.Expression1[System.Func2[KokazGoodsTransfer.Models.Receipt,System.Decimal]])' (Parameter 'arg1')'

代码示例

var sum = await context.Receipts.GroupBy(c => c.ClientId).Select(c => new { c.Key, Sum = c.Sum(c=>c.Amount) }).ToListAsync();

一切正常

但是当我尝试这个时我看到了错误

Func<Receipt, Decimal> func = c => c.Amount;
var sum = await context.Receipts.GroupBy(c => c.ClientId).Select(c => new { c.Key, Sum = c.Sum(func) }).ToListAsync();

谢谢

最佳答案

EF 通常需要 expression tree能够将代码转换为实际的 SQL 查询。

你可以尝试这样的事情(虽然没有测试,但在某些情况下,据我所知,这些技巧是有效的):

Expression<Func<Receipt, Decimal>> func = c => c.Amount;
var sum = await context.Receipts
.GroupBy(c => c.ClientId)
.Select(c => new { c.Key, Sum = c.AsQueryable().Sum(func) })
.ToListAsync();

否则,您可能需要手动构建 select 语句表达式(这并不容易)或查看第 3 方库,如 LINQKit这允许 to use Func's用一些魔法。沿着这条线的东西:

Expression<Func<Receipt, Decimal>> func = c => c.Amount;
var sum = await context.Receipts
.AsExpandable() // or WithExpressionExpanding on the context DI set up
.GroupBy(c => c.ClientId)
.Select(c => new { c.Key, Sum = c.Sum(func.Compile()) })
.ToListAsync();

关于c# - 如何使用 ef 核心发送 Func<T,decimal> 类型的变量以从 IQueryable 求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73491392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com