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 が失敗し、キャストが機能しませんでした。それで、私は何が欠けていますか、それとも別の方法がありますか? columnname に対して巨大な switch ステートメントを作成することもできますが、それは良くありません :)

4

1 に答える 1

2

タイプが であることがわかっている場合はdecimal、ゲッターに次のように伝えます。

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 に答える