Есть ли способ переопределить отображаемое предложение в порядке упорядочения коллекции при подкачке в NHibernate? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть объект с набором сумок, и я хочу просмотреть весь набор данных. В коллекции есть пункт 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

Если я удалю упорядочение из сопоставления, тогда SQL изменится на это (намного лучше):

OVER(ORDER BY this_.Id) as __hibernate_sort_row

Таким образом, вопрос заключается в следующем: есть ли способ переопределить или удалить отображенное предложение order-by?

1 Ответ

0 голосов
/ 30 сентября 2011

После комментариев Тилака Натена и Фиро, похоже, что короткий ответ на вопрос: «Нет, ты не можешь этого сделать».Длинный ответ состоит в том, чтобы удалить атрибут order-by из сопоставления и добавить его при необходимости.Причина, по которой это произошло, в том, что она всегда нужна, за исключением одной необычной ситуации.Firo предложил изменить заводскую конфигурацию, которая, я думаю, будет работать, потому что это для отчетов.Для тех, кто хочет знать, как это сделать, вот код, позволяющий программно удалить заказ из сопоставления xml:

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();
...