【问题标题】:NHibernate Select N+1 and RecursiveNHibernate 选择 N+1 和递归
【发布时间】:2012-04-07 20:48:10
【问题描述】:

我有几个数据类:

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 的所有 DataRecords,包括 Children、Properties 和 Fotos。

在原始 SQL 中执行此操作是一个带有几个连接的简单语句,但是当我尝试使用 linq 和 nhibernate 执行此操作时,它会导致 1500 个 Select N+1 语句,并且速度非常慢。

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

如何在 1 个查询中获取 1 个记录组的整个“数据树”?

提前致谢!!!!

【问题讨论】:

    标签: c# nhibernate fetch recursive-query select-n-plus-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>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多