Linq动态总和

时间:2017-12-15 17:09:10

标签: entity-framework sum

我想在数据库中收集多个字段后发送一笔金额。 但我需要将字段写为字符串。 我可能无法完全解释我的问题,我会尽力举例说明。

我想要做的是这段代码的lambda状态

我想这样做:

expression = x => x.M1_TotalLoss + x.M2_TotalLoss;

我的代码:

var param = Expression.Parameter(typeof(FooDomain), "x");
var value = Expression.Property(param, ("M1_TotalLoss"+"M2_TotalLoss"));

var rest = Expression.Lambda<Func<FooDomain, double>>(value, param);

var result = myContext.FooDomain().
                GroupBy(gp=>gp.Year).
                Select(s => new
                {
                    TotalLoss = Math.Round(s.AsQueryable().Sum(rest), 2)
                }).
                OrderByDescending(o => o.TotalLoss).
                ToList();

但由于我无法正确编写谓词,因此出现以下错误:

exceptionMessage =未为类型'FooDomain'定义的示例功能'M1_TotalLossM2_TotalLoss'。

1 个答案:

答案 0 :(得分:2)

让我们看看这里有什么:

x => x.M1_TotalLoss + x.M2_TotalLoss

x显然是参数,所以

var param = Expression.Parameter(typeof(FooDomain), "x");

没问题。

x.M1_TotalLossx.M2_TotalLoss分别是参数 x属性 "M1_TotalLoss""M2_TotalLoss" },所以让我们反思:

var value1 = Expression.Property(param, "M1_TotalLoss");
var value2 = Expression.Property(param, "M2_TotalLoss");

x.M1_TotalLoss + x.M2_TotalLoss只是两者的 add 操作:

var value = Expression.Add(value1, value2);

你完成了 - 剩下的代码都没问题。

超过2个属性怎么样?

由于op1 + op2 + op3等同于(op1 + op2) + op3,或者使用方法符号Add(Add(op1, op2), op3),因此可以看出,可以递归地描述N个加法,因为将下一个操作数添加到加法的结果中以前的操作数。使用LINQ Aggregate方法可以轻松实现。

因此,如果IEnumerable<string>包含所需的属性名称,则可以使用以下内容:

var propertyNames = new [] { "M1_TotalLoss", "M2_TotalLoss", };

var param = Expression.Parameter(typeof(FooDomain), "x");
var value = propertyNames.Select(name => Expression.Property(param, name))
    .Aggregate<Expression>(Expression.Add);

// the rest of the code (same as yours)