簡體   English   中英

NHibernate選擇N + 1和遞歸

[英]NHibernate Select N+1 and Recursive

我有幾個數據類:

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; }
}

因此,一個RecordGroup被“連接”到多個DataRecords,有幾個子級(又有子級等),每個子級都有幾個Properties和Fotos。 我需要根據某個RecordGroup的所有DataRecords,包括Children,Properties和Fotos。

在原始SQL中執行此操作是一個簡單的語句,其中包含一些聯接,但是當我嘗試使用linq和nhibernate進行此操作時,它導致1500個Select N + 1語句,並且運行速度非常慢。

我已經嘗試過.FetchMany( x => x.Children );

如何在1個查詢中獲得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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM