Если я правильно понимаю ваше описание, то ваша модель выглядит примерно так (я опускаю ключевые свойства и т. Д.):
public class Country
{
public ICollection<State> States { get; set; }
}
public class State
{
public ICollection<School> Schools { get; set; }
}
public abstract class School { ... }
public class ElementarySchool : School { ... }
public class HighSchool : School
{
public ICollection<DrivingCourse> DrivingCourses { get; set; }
}
public class DrivingCourse { ... }
И у вас есть DbContext, который включает public DbSet<Country> Countries { get; set; }
.
Теперь вы хотите загрузить все Countries
(или отфильтрованную коллекцию стран), включая все свойства навигации (особенно также DrivingCourses
).
Я не знаю, возможно ли это с однимтуда и обратно в базу данных (за счет загрузки всех коллекций).Решение, которое потребует многократных поездок туда и обратно, может быть таким:
// Load all Countries including `States` and `Schools` collection
// but not the `DrivingCourses` collection
var countryList = context.Countries
.Include(c => c.States.Select(s => s.Schools))
.ToList();
// Create in-memory list of all loaded Schools of type HighSchool
IEnumerable<HighSchool> highSchoolList =
countryList.SelectMany(c =>
c.States.SelectMany(s => s.Schools.OfType<HighSchool>()));
// Explicitely load the DrivingCourses one by one
foreach (var item in highSchoolList)
context.Entry(item).Collection(h => h.DrivingCourses).Load();
Просто в качестве первой идеи.Вероятно, есть лучшие решения.
Редактировать
Использование Load
в странах DbSet не меняет проблему.Load
- это то же самое, что и ToList()
без фактического возврата результата, объекты просто загружаются в контекст.Приведенный выше код можно переписать так:
context.Countries.Include(c => c.States.Select(s => s.Schools)).Load();
IEnumerable<HighSchool> highSchoolList =
context.Countries.Local.SelectMany(c =>
c.States.SelectMany(s => s.Schools.OfType<HighSchool>()));
foreach (var item in highSchoolList)
context.Entry(item).Collection(h => h.DrivingCourses).Load();
Но это в основном то же самое, что и раньше, и это также не решает проблему загрузки DrivingCourses
в первом операторе Load
водиночный DB туда и обратно.