2012-03-23 69 views
1

我有一对夫妇的数据类:NHibernate的选择N + 1和递归

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,有几个孩子(这又带着小孩等)各他们有几个属性和照片。 根据某个RecordGroup,我需要所有的DataRecords包括Children,Properties和Fotos。

在原始SQL中这样做是一个简单的语句,只有几个连接,但是当我尝试使用linq和nhibernate来做到这一点时,会导致1500选择N + 1语句和巨大的减速。

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

怎么可能拿到1查询中1 Recordgroup的整体“的Datatree”?

在此先感谢!

回答

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>();