NHibernate选择N+1并递归

本文关键字:递归 N+1 选择 NHibernate | 更新日期: 2023-09-27 18:28:42

我有几个数据类:

public class RecordGroup
{
    public virtual DataRecord RootDataRecord;
}
public class DataRecord 
{
    public virtual string Name { get; set; }
    public virtual RecordGroup RecordGroup { get; set; }
    public virtual IList<DataRecord> Children { get; set; }
    public virtual DataRecord Parent { get; set; }
    public virtual IList<DataProperty> DataProperties { get; set; }
    public virtual IList<Foto> Fotos { get; set; }
}
public class DataProperty
{
    public virtual string Name { get; set; }
    public virtual string Value { get; set; }
    public virtual IList<Foto> Fotos { get; set; }
}
public class Foto
{
    public virtual string Name { get; set; }
    public virtual byte[] Data { get; set; }
}

因此,1个RecordGroup"连接"到多个DataRecords,有几个孩子(又有了孩子等),每个孩子都有几个Properties和Fotos。我需要根据某个RecordGroup的所有数据记录,包括Children、Properties和Fotos。

在原始SQL中执行此操作是一个简单的语句,只需要几个联接,但当我尝试使用linq和nhibernate执行此操作时,会导致1500个Select N+1语句,并且速度会大大减慢。

我已经尝试过.FetchMany( x => x.Children );

如何在1个查询中获得1个记录组的整个"数据树"?

提前感谢!!!!

NHibernate选择N+1并递归

我想,你需要这样的东西:

   var recordGroupId = // your recordGroup Id
   Session.QueryOver<DataRecord>()
     .Where(dataRecord.RecordGroup.Id == recordGroupId)
     .Fetch(dataRecord  => dataRecord.Children).Eager
     .Fetch(dataRecord  => dataRecord.DataProperties).Eager
     .Fetch(dataRecord  => dataRecord.Fotos).Eager
     .TransformUsing(Transformers.DistinctRootEntity)
     .List<DataRecord>();