2012-03-23 34 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>();