对于实体ParentEntity
与ChildEntity
类型的集合,其包含int类型的Order
属性,如何能父实体可以与子集特别是通过使用标准 API的由Order
排序检索如在部分12.4中讨论NHibernate文档here?如何为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或解释说明为什么这不起作用。我知道排序可以通过映射完成,但我试图了解具体问题是使用标准方法。
==== EDIT ====
下面是该模型和映射:
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
,但结果仍未排序。
我正在使用流利,将集合声明为IList,并尝试将映射作为默认包和列表(例如HasMany(x => x.Children).AsList()),但都显示相同的结果。 –
2010-01-06 15:19:31
此外,生成的第一个SELECT会正确地对结果进行排序,所以看起来如果第二个SELECT没有被生成,那么该列表将根据需要填充。 – 2010-01-06 15:22:06