【问题标题】:Dynamic QueryOver in nHibernatenHibernate 中的动态 QueryOver
【发布时间】:2011-12-19 12:04:46
【问题描述】:

类似于 'Dynamic LINQ OrderBy' 我想做一个动态的 QueryOver-OrderBy。但是,当我这样做时:

query.OrderBy(h => h.GetType().GetProperty(sort.Member).GetValue(h, null)).Asc

我得到一个例外,上面写着:

Unrecognised method call in epression h.GetType().GetProperty(value(Domain.Model.Repository+<>c__DisplayClass15).sort.Member).GetValue(h, null)

显然,nHibernate 无法理解正在发生的事情。有没有人知道如何解决这个特定问题?

【问题讨论】:

    标签: nhibernate reflection dynamic queryover


    【解决方案1】:

    链接问题中的解决方案不起作用,因为当连接多个实体并且应该对来自不同实体的属性组合进行排序时仍然存在问题。我能想到的唯一实用的解决方案是创建一个从sort.MemberProjection.Property 的字典。

    var dict = new Dictionary<string, string>();
    dict.Add("sortMember", "entityAlias.Property");
    var sortOn = dict[sort.Member];
    query.OrderBy(Projections.Property(sortOn)).Asc;
    

    这很好用。字典基本上替换了整个 if-else 结构,并且一个简单的循环添加了 orderBy。我想我可以以类似的方式修改过滤部分,但还没有时间处理该部分。

    【讨论】:

      【解决方案2】:

      动态 QueryOver 没有多大意义。

      QueryOver 本身就是强类型的 Criteria。使用 Criteria 而不是 QueryOver。

      【讨论】:

      • 我正在使用 QueryOver 的强类型特性来构建查询的主要部分。只是理想情况下过滤和排序需要是动态的,因为这些指令来自 GUI。我可以写一个大的 if-else,但是使用反射的更通用的解决方案会更好。
      【解决方案3】:

      您应该使用您在“Dynamic Linq OrderBy”链接中提供的方法。您的代码中的问题是 NHibernate 无法解析该表达式。

      另外,我真的不明白您为什么要按属性内的值而不是属性本身进行排序。

      假设您尝试按属性名称排序,您需要做的就是:

      1 - 在链接中为扩展方法添加“使用”

      2 - 像这样使用它:

      query.OrderBy(sort.Member);
      

      没试过,应该可以的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多