Для сущности ParentEntity
с коллекцией типа ChildEntity
, которая содержит свойство Order
типа int, как можно извлечь родительскую сущность с дочерней коллекцией, отсортированной по Order
специально с помощью использования Criteria API, как описано в разделе 12.4 документации NHibernate здесь ?
Я пытался использовать код, подобный следующему:
public ParentEntity GetById(int id)
{
ICriteria criteria = _sessionFactory.GetCurrentSession().CreateCriteria(typeof (ParentEntity));
criteria.Add(Restrictions.Eq("Id", id))
.CreateCriteria("Children")
.AddOrder(Order.Desc("Order"));
return (ParentEntity) criteria.List()[0];
}
К сожалению, этот код выдает 2 SELECT
операторов. Первый выбор содержит order by
, который сортирует связанные извлеченные столбцы, но второй - нет, и, похоже, это тот, из которого заполняется коллекция.
Обратите внимание, я пытался настроить NHibernate для выполнения извлечения из внешнего соединения, без которого работает, как ожидается, без критериев. Таким образом, он создает два запроса без настроенного внешнего соединения, но только один с настроенным внешним соединением. Добавление добавленных критериев, кажется, вызывает дополнительный запрос независимо от того.
Пожалуйста, ограничьте ответы на то, как это можно сделать с помощью API критериев или объяснений, почему это не сработает. Я знаю, что сортировку можно выполнить с помощью сопоставления, но я пытаюсь понять, в чем конкретно проблема, используя метод критериев.
==== РЕДАКТИРОВАТЬ ====
Ниже приведены модель и сопоставления:
public class ParentEntity
{
public virtual int Id { get; private set; }
public virtual IList<ChildEntity> Children { get; set; }
public ParentEntity()
{
Children = new List<ChildEntity>();
}
}
public class ChildEntity
{
public virtual int Id { get; private set; }
public virtual ParentEntity Parent { get; private set; }
public virtual int Order { get; private set; }
protected ChildEntity()
{
}
public ChildEntity(int order)
{
Order = order;
}
}
public class ParentEntityMap : ClassMap<ParentEntity>
{
public ParentEntityMap()
{
WithTable("Parent");
Id(p => p.Id);
HasMany(p => p.Children)
.KeyColumnNames.Add("Parent_Id")
.Cascade.All();
}
}
public class ChildEntityMap : ClassMap<ChildEntity>
{
public ChildEntityMap()
{
WithTable("Child");
Id(c => c.Id);
Map(c => c.Order, "[Order]");
References(c => c.Parent, "Parent_Id")
.Cascade.All();
}
}
==== РЕДАКТИРОВАТЬ 2 ====
В качестве обновления после добавления Not.LazyLoad () в Parent генерируется только один SELECT
, однако результаты по-прежнему не отсортированы.