Нельзя использовать свойство навигации типа IQueryable<T>
.Вы должны использовать ICollection<T>
или некоторый тип коллекции, который реализует ICollection<T>
- например, List<T>
.(IQueryable<T>
не реализует ICollection<T>
.)
Свойство навигации - это просто объект или коллекция объектов в памяти, либо оно null
, либо коллекция пуста.
Он никогда не загружается из базы данных при загрузке родительского объекта, который содержит свойство навигации из базы данных.
Вы должны либо явно указать, что хотите загрузить свойство навигации вместе с родительским объектом, который является нетерпеливая загрузка :
var movieTypes = context.Movie_Types.Include(m => m.Movies).ToList();
// no option to filter or sort the movies collection here.
// It will always load the full collection into memory
Или она будет загружена отложенной загрузкой (которая включена по умолчанию, если ваше свойство навигации virtual
):
var movieTypes = context.Movie_Types.ToList();
foreach (var mt in movieTypes)
{
// one new database query as soon as you access properties of mt.Movies
foreach (var m in mt.Movies)
{
Console.WriteLine(m.Title);
}
}
Последний вариант - явная загрузка , которая наиболее близка к вашему намерению.
var movieTypes = context.Movie_Types.ToList();
foreach (var mt in movieTypes)
{
IQueryable<Movie> mq = context.Entry(mt).Collection(m => m.Movies).Query();
// You can use this IQueryable now to apply more filters
// to the collection or sorting, for example:
mq.Where(m => m.Title.StartWith("A")) // filter by title
.OrderBy(m => m.PublishDate) // sort by date
.Take(10) // take only the first ten of result
.Load(); // populate now the nav. property
// again this was a database query
foreach (var m in mt.Movies) // contains only the filtered movies now
{
Console.WriteLine(m.Title);
}
}