【发布时间】:2010-01-06 00:10:12
【问题描述】:
对于具有ChildEntity类型集合的实体ParentEntity,其中包含一个int类型的Order属性,如何使用按Order排序的子集合检索父实体具体通过使用NHibernate 文档 here? 的第 12.4 节中讨论的标准 API 的?
我尝试过使用类似于以下的代码:
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,但是,结果仍然是未排序的。
【问题讨论】:
标签: nhibernate