2011-11-01 70 views
1

与'Dynamic LINQ OrderBy'类似,我想创建一个动态QueryOver-OrderBy。然而,当我这样做:nHibernate中的动态查询

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的有一些很难理解发生了什么事情。有没有人有关于如何解决这个特定问题的想法?

回答

2

链接问题中的解决方案不起作用,因为当多个实体连接在一起并且应该对来自不同实体的属性组合进行排序时仍存在问题。我能想到的唯一实际解决方案是创建一个从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。我想我可以用类似的方式修改过滤部分,但还没有时间去处理那部分。

0

动态QueryOver没有多大意义。

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

+0

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

0

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

此外,我不明白你为什么要按属性内的值排序,而不是属性本身。

假设你正在试图通过属性名,所有你需要做的排序是:

1 - 在您的链接添加一个“使用”为扩展方法

2 - 这样使用它:

query.OrderBy(sort.Member); 

还没有尝试过,但应该工作。