2013-01-08 59 views
1

對於某個列名,我想計算SUM。我剛剛發現瞭如何使用反射,但不知道如果我做正確的方式..C#使用反射實體框架總和

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應該是十進制類型,但在中類型.GetProperty將失敗並且投射它不起作用。那麼我錯過了什麼,或者有另一種方式? 我能爲COLUMNNAME一個巨大的switch語句,但是這不是很好是吧:)

回答

1

如果你知道的類型應該是decimal,然後告訴吸氣劑:

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

然後應該工作使用LINQ到對象爲:

var total = objectSet.Sum(fieldGetter); 

請注意,如果你打算使用LINQ到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()); 
+0

鑄造成十進制給出了一個例外:{「指定的轉換無效」} – RubenR

+0

@RubenR則該屬性ISN」 t'小數' –

+0

Omg就是這樣!謝謝! – RubenR