4

私は次のようなコードを持っています

DepartmentPaperConsumption dto = null;

その後、NHibernate QueryOverの結果が表示され、注文したい

result.OrderByAlias(() => dto.TotalColorCopys);

しかし、文字列を使用して動的にの任意のプロパティを指定できるようにしたいと思いdtoます。Dynamic LINQを使用してみましたが、取得できないようです。また、LambdaExpressionをゼロから構築してみましたが、運が悪かったのです。助けていただければ幸いです。

4

3 に答える 3

10

ここでラムダを構築する方法を見ることができますが、あなたの場合は本当に簡単です:

var arg = Expression.Constant(null, typeof(DepartmentPaperConsumption));
var body = Expression.Convert(Expression.PropertyOrField(arg, propertyName),
    typeof(object));
var lambda = Expression.Lambda<Func<object>>(body);

トリッキーなことは、上記のリンクに示されているように、OrderByAlias-を使用することが方法かもしれないことを呼び出すことです。MakeGenericMethod

于 2011-01-27T12:49:31.487 に答える
3

作成したとおりに動的言語クエリを使用するか、式ツリー http://msdn.microsoft.com/en-us/library/bb397951.aspxを使用します。

他に解決策はないと思います

于 2011-01-27T12:27:45.867 に答える
2

私は自分で1つの方法を見つけることができましたが、それはより回避策のように見えます。Marcのバージョンははるかに単純です。テストしたらすぐにマークの答えを受け入れます。これが私の回避策です:

public class MemberModifier : ExpressionVisitor
{
    public Expression Modify(Expression expression)
    {
        return Visit(expression);
    }

    protected override Expression VisitMember(MemberExpression node)
    {
        var t = typeof (DepartmentPaperConsumption);
        var memberInfo = t.GetMember("TotalPages")[0];
        return Expression.MakeMemberAccess(node.Expression, memberInfo);
    }
}

そしてコードで

        Expression<Func<object>> exp = () => dto.TotalColorPrints;
        var mod = new MemberModifier();
        var modEx = mod.Modify(exp);
        result.OrderByAlias((Expression<Func<object>>)modEx)

MemberModifierは生のプロトタイプにすぎません。より一般的で、DepartmentConsumptionに依存せず、ハードコードされた「TotalPages」がない必要があります。

于 2011-01-27T13:34:28.833 に答える