Я использую Entity Framework 6 для загрузки древовидной структуры.Из-за количества уровней в дереве я не хочу использовать много включений, поскольку перекрестный продукт будет слишком большим.Я использую здесь меньший пример для объяснения.
public class Hospital
{
public virtual List<Station> Stations {get;set;}
public virtual Contact Contact {get;set;}
public virtual string Uid {get;set;}
}
public class Station
{
public virtual List<Patient> Patients {get;set;}
public virtual Contact Contact {get;set;}
}
public class Patient
{
public virtual List<Medication> Medications{get;set;}
public virtual string Name {get;set;}
}
Я пытался сделать что-то вроде этого:
var hospital = context.Hospitals
.Include(h => h.Contact)
.Where(h => h.Uid == myUid);
var stations = hospital.SelectMany(h => h.Stations).Include(s => s.Contact);
var patients = stations.SelectMany(s => s.Patients);
var medications = patients.SelectMany(p => p.Medications);
var myHospital = hospital.Single();
stations.ToList();
patients.ToList();
medications.ToList();
В моем понимании это должно выдать 4 запроса, а структура сущности должнаисправить ассоциации в памяти.Несмотря на то, что были выполнены 4 запроса, я заметил, что Entity Framework по-прежнему загружается медленно, когда пытался перемещаться по дереву в памяти.похоже, это не относится к списку станций, но к листовым уровням (например, пациент, лекарства, ...)
Также я заметил, что если я отключу ленивую загрузку, я могу легко перемещаться по дереву ужепоэтому данные уже должны быть загружены.Однако я бы предпочел не отключать отложенную загрузку.
Может кто-нибудь объяснить мне, почему EF отложенно загружает уже загруженные свойства?