首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NHibernate中分页时,有没有办法覆盖集合映射的order-by子句?

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

Stack Overflow用户
提问于 2011-09-29 09:54:14
回答 1查看 335关注 0票数 1

我有一个具有袋子集合的实体,并且我希望对整个数据集进行分页。该集合具有order-by子句。当我尝试紧急加载集合时,NHibernate生成的SQL非常非常慢,因为它导致SQL Server对一个非常不唯一的属性进行排序,并且表中有大量数据。

代码:

代码语言:javascript
复制
var session = NHibernateSessionManager.Instance.GetSession();
session.CreateCriteria<Album>()
    .SetFetchMode("Track", FetchMode.Eager)
    .SetMaxResults(1000)
    .SetFirstResult(1)
    .AddOrder(new Order("Id", true))
    .List();

包映射(请注意order-by属性):

代码语言:javascript
复制
<bag name="Track" inverse="true" lazy="true" batch-size="1000" cascade="none" 
     order-by="TrackNumber ASC">

生成的相关SQL:

代码语言:javascript
复制
OVER(ORDER BY track2_.TrackNumber, this_.Id) as __hibernate_sort_row

如果我从映射中删除order-by,那么SQL会变成这样(好得多):

代码语言:javascript
复制
OVER(ORDER BY this_.Id) as __hibernate_sort_row

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-30 08:27:57

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

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7591616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档