NHibernate Select N + 1 и рекурсивный - PullRequest
1 голос
/ 23 марта 2012

У меня есть пара классов данных:

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, имеет несколько дочерних элементов (которые снова получили дочерние элементы и т. Д.), Каждый из которых имеет несколько свойств.и фото.Мне нужны все DataRecords, включая Children, Properties и Fotos в соответствии с определенной RecordGroup.

Выполнение этого в сыром SQL - это простое утверждение с несколькими объединениями, но когда я пытаюсь сделать это с помощью linq и nhibernate, это приводит кв 1500 Выберите N + 1 операторов и огромное замедление.

Я уже пробовал .FetchMany( x => x.Children );

Как можно получить все "дерево данных" 1 группы записей в 1 запросе?

Заранее спасибо !!!!

1 Ответ

1 голос
/ 23 марта 2012

Я думаю, вам нужно что-то вроде этого:

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