c#使用反射实体框架sum

本文关键字:框架 sum 实体 反射 | 更新日期: 2023-09-27 17:51:02

对于某个列名,我想计算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);

我不能得到这个工作,因为字段getter应该是类型的十进制,但类型。GetProperty将失败,并且它的强制转换无法工作。我错过了什么,还是还有别的办法?我可以为columnname创建一个巨大的switch语句,但这不是很好,不是吗?)

c#使用反射实体框架sum

如果你知道类型应该是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());