在NHibernate中进行分页时,有没有办法覆盖集合的映射order-by子句?

时间:2011-09-29 01:54:14

标签: nhibernate collections paging

我有一个带有行李集合的实体,我想翻阅整个数据集。该集合有一个order-by子句。当我尝试加载集合时,NHibernate生成的SQL非常慢,因为它导致SQL Server对非常非唯一的属性进行排序,并且表中有大量数据。

代码:

var session = NHibernateSessionManager.Instance.GetSession();
session.CreateCriteria<Album>()
    .SetFetchMode("Track", FetchMode.Eager)
    .SetMaxResults(1000)
    .SetFirstResult(1)
    .AddOrder(new Order("Id", true))
    .List();

行李映射(注意order-by属性):

<bag name="Track" inverse="true" lazy="true" batch-size="1000" cascade="none" 
     order-by="TrackNumber ASC">

生成的相关SQL:

OVER(ORDER BY track2_.TrackNumber, this_.Id) as __hibernate_sort_row

如果我从映射中删除order-by,则SQL会更改为此(更好):

OVER(ORDER BY this_.Id) as __hibernate_sort_row

所以问题是:有没有办法覆盖或删除映射的order-by子句?

1 个答案:

答案 0 :(得分:0)

在Thilak Nathen和Firo的评论之后,问题的简短答案似乎是:“不,你不能这样做”。长的答案是从映射中删除order-by属性并根据需要添加它。它之所以存在,除了这种不寻常的情况外,总是需要它。 Firo建议覆盖我认为可行的工厂配置,因为这是用于报告的。对于其他想知道如何操作的人,这里是以编程方式从xml映射中删除order-by的代码:

Configuration cfg = new Configuration().Configure();
var albumMapping = cfg.ClassMappings.Where(x => x.DiscriminatorValue == "Foo.Album").First();
var trackProperty = albumMapping.GetProperty("Track");
var bagMapping = ((NHibernate.Mapping.Bag)trackProperty.Value);
bagMapping.OrderBy = "";
sessionFactory = cfg.BuildSessionFactory();