1

对于某个列名,我想计算 SUM。我刚刚发现如何使用反射,但不知道我是否以正确的方式做这件事..

string columnName = "days";
ObjectQuery<TableX> objectSet = context.CreateObjectSet<TableX>();

Func<TDomainEntity, object> fieldGetter;
var type = typeof(TDomainEntity);
var prop = type.GetProperty(columnName);
fieldGetter = e => prop.GetValue(e,null);

//this wouldn't work because the fieldGetter should be Func<TDomainEntity, decimal> and not object
var total = objectSet.Sum(fieldGetter);

我无法让它工作,因为 fieldgetter 应该是 decimal 类型,但 type.GetProperty 将失败并且强制转换它不起作用。那么我错过了什么还是有其他方法?我可以为列名创建一个巨大的 switch 语句,但这并不好 :)

4

1 回答 1

2

如果你知道类型应该是decimal,然后告诉 getter:

Func<TDomainEntity, decimal> fieldGetter = e => (decimal)prop.GetValue(e,null);

然后它应该与 LINQ-to-Objects 一起使用:

var total = objectSet.Sum(fieldGetter);

请注意,如果您打算使用 LINQ-to-EF,则必须改为构建表达式树:

var p = Expression.Parameter(typeof(TDomainEntity));
var lambda = Expression.Lambda<Func<TDomainEntity, decimal>>(
    Expression.PropertyOrField(p, columnName), p);
var total = query.Sum(lambda);

当然,您可以使用这种方法

var p = Expression.Parameter(typeof(TDomainEntity));
var lambda = Expression.Lambda<Func<TDomainEntity, decimal>>(
    Expression.PropertyOrField(p, columnName), p);
var total = objectSet.Sum(lambda.Compile());
于 2013-01-08T10:00:38.883 回答