我想在数据库中收集多个字段后发送一笔金额。 但我需要将字段写为字符串。 我可能无法完全解释我的问题,我会尽力举例说明。
我想要做的是这段代码的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'。
答案 0 :(得分:2)
让我们看看这里有什么:
x => x.M1_TotalLoss + x.M2_TotalLoss
x
显然是参数,所以
var param = Expression.Parameter(typeof(FooDomain), "x");
没问题。
x.M1_TotalLoss
和x.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)