2009-05-05 2 views
0

Отчасти это связано с this.
Я хотел бы найти способ сортировки связанного (HasMany) результата коллекции непосредственно в запросе Nhibernate.Сортировка связанной коллекции в запросе Nhibernate

ICriteria criteria = Session.CreateCriteria(typeof(PortalPage)); 
criteria.CreateAlias("PartialViews", "vc"); 
criteria.AddOrder(Order.Asc("vc.ColumnNumber")); 
criteria.Add(Property.ForName("Url").Eq(pageUrl)); 
return criteria.UniqueResult<PortalPage>(); 

Correcly генерирует выбор с помощью ORDER BY, но результат в связанной коллекции не упорядочен.

Я хотел бы избежать сортировки коллекции после того, как результат будет возвращен (например, с использованием linq в объекты), возможно ли это?

UPDATE: Как Стив предложил проблема может быть решена путем жесткого кодирования атрибута порядка в отображении как:

HasMany(x => x.PartialViews).KeyColumnNames.Add("PageId").AsBag().SetAttribute("order-by", "ColumnNumber"); 

ответ

1

уточнили вы коллекцию как тип списка, а не мешок или набор? Если вы используете тип отображения списка и укажите столбец индекса для отображения списка, все, о чем вам следует позаботиться.

См. docs here, а также есть more info here, хотя это вторая старая должность, поэтому следите за тем, что могло измениться.

Вот простой пример коллекции список отображения:

<list name="Images table="Images"> 
    <key column="Id"/> 
    <index column="Position"/> 
    <element type="String" column="FileName"/> 
</list> 

Плавное отображение для данного примера будет что-то вроде этого:

HasMany(x => x.Images).AsList(x => x.WithColumn("Position")); 
+0

Стив, если я понимаю, это заставит меня «жесткий код «порядок сортировки. Можно ли получить какой-то динамический результат с Linq2Nhibernate или другим способом? Если не так, как бы вы выразили одно и то же отображение в свободном nhibernate? – Ronnie

+0

Ронни, я не уверен в получении динамического результата без сортировки после возврата коллекции с помощью метода OrderBy. Я подозреваю, что нет никакого способа сделать это надежно, и это связано с природой дочерних коллекций в объектной модели DDD - если дочерняя коллекция не имеет встроенного порядка сортировки (например, списка, а не набора или сумки), то это просто не имеют большое значение с точки зрения моделирования, чтобы вы могли указать порядок при извлечении данных. Мне нужно проверить синтаксис Fluent для сопоставления списка - я обновлю ответ, когда найду это! –