【问题标题】:How to build () => x.prop lambda expression dynamically?如何动态构建 () => x.prop lambda 表达式?
【发布时间】:2011-01-27 12:26:15
【问题描述】:

我有类似的代码

DepartmentPaperConsumption dto = null;

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

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

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

【问题讨论】:

  • 您介意发布OrderbyAlias 方法的签名吗?
  • 如果有帮助 QueryOverOrderBuilder OrderByAlias(Expression> path)

标签: c# linq nhibernate lambda queryover


【解决方案1】:

您可以看到如何构造 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 可能是一种方式,如上面的链接所示。

【讨论】:

  • 这不可能是 OP 想要的 Expression
  • @Ani - 好的,我会解决的。没有签名没有帮助;p
  • @Ani - 你现在好点了吗?
  • +1。啊,现在我们更接近了,但是如果不了解 OrderByAlias(签名、重载等)的更多信息,就很难继续进行。我想发布类似的东西,但我很犹豫,因为我认为发生了一些时髦的事情。 nhforge.org/blogs/nhibernate/archive/2009/12/17/…
  • 马克,OP 已经发布了签名。我想你可能只需要一个Expression.Lambda&lt;Func&lt;object&gt;&gt;(Expression.TypeAs(body, typeof(object)), null) 就可以了。不过不确定,我认为这不仅仅是表面上看到的。
【解决方案2】:

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

我认为没有其他解决方案

【讨论】:

    【解决方案3】:

    我自己设法找到了一种方法,但它看起来更像是一种解决方法,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”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多