我有像
这样的代码DepartmentPaperConsumption dto = null;
然后我有NHibernate QueryOver结果,我想订购它
result.OrderByAlias(() => dto.TotalColorCopys);
但我希望能够使用字符串动态指定dto
的任何属性。
我尝试使用Dynamic LINQ,但似乎我无法得到它。
我也试过从头开始构建LambdaExpression - 也没有运气。
我将不胜感激任何帮助。
答案 0 :(得分:9)
你可以看到如何构造lambda here,但在你的情况下它真的很简单:
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
可能就是这样,如上面的链接所示。
答案 1 :(得分:3)
在编写时使用动态linq,或使用表达式树 http://msdn.microsoft.com/en-us/library/bb397951.aspx
我认为没有其他解决方案
答案 2 :(得分: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”