4

我有类似的代码

DepartmentPaperConsumption dto = null;

然后稍后我有 NHibernate QueryOver 结果,我想订购它

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

但我希望能够dto用字符串动态指定任何属性。我尝试使用动态 LINQ,但似乎我无法得到它。我还尝试从头开始构建 LambdaExpression - 也没有运气。我将不胜感激任何帮助。

4

3 回答 3

10

您可以在此处查看如何构造 lambda ,但在您的情况下它确实非常简单:

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- usingMakeGenericMethod可能是方式,如上面的链接所示。

于 2011-01-27T12:49:31.487 回答
3

就像你写的那样使用动态 linq,或者使用表达式树 http://msdn.microsoft.com/en-us/library/bb397951.aspx

我认为没有其他解决方案

于 2011-01-27T12:27:45.867 回答
2

我自己设法找到了一种方法,但它看起来更像是一种解决方法,Marc 的版本更简单。我会在测试后立即接受 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 回答