【发布时间】:2018-05-24 19:11:27
【问题描述】:
我是 nhibernate 的新手,我无法弄清楚这一点。 我有一个类似于下级的实体;
public class MotherCollection
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ISet<Class1> Collection1 { get; set; }
public virtual ISet<Class2> Collection2 { get; set; }
public virtual ISet<Class3> Collection3 { get; set; }
public virtual ISet<Class4> Collection4 { get; set; }
}
与其他实体有许多一对多的关系。 我使用以下映射配置此关系;
HasMany(d => d.Collection1).KeyColumn("McId");
HasMany(d => d.Collection2).KeyColumn("McId");
HasMany(d => d.Collection3).KeyColumn("McId");
HasMany(d => d.Collection4).KeyColumn("McId");
子类配置类似;
References(c1=>c1.MotherCollection).Column("McId");
等等。
当我从 db 查询这个实体,获取所有关系时,我得到一个类似于这个的巨大查询:
SELECT * FROM MotherCollection mc
JOIN c1 on mc.Id=c1.mcId
JOIN c2 on mc.Id=c2.mcId
JOIN c3 on mc.Id=c3.mcId
JOIN c4 on mc.Id=c4.mcId
这个查询会导致很多重复的行并且需要很长时间来执行。
我希望 nhibernate 以某种方式将此查询分离为单个 SELECT 查询,如下所示
SELECT * FROM MotherCollection Where Id = @Id
SELECT * FROM c1 Where mcId = @Id
等等。有点类似于延迟加载集合时发生的情况。 我设法通过将我想要的集合设置为惰性集合并在它退出我的数据层之前访问它们的 First() 属性来实现这种行为。不过,我猜想在 Nhibernate 中一定有更优雅的方式来做到这一点。
我尝试过类似这样的查询:
var data = session.QueryOver<DataSet>().Fetch(d=>d.Collection1).Eager.Fetch(d=>d.Collection2).Eager....
谢谢。
【问题讨论】:
标签: c# sql nhibernate linq-to-nhibernate