Использование lazy loading entity framework [дубликат]

177
14 апреля 2018, 18:30

На данный вопрос уже ответили:

  • Помогите разобраться в ошибке: Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть 3 ответа

Здравствуйте, создал консольное приложение с entity framework. Для загрузки данных использую принцип lazy load. И всё работает если написать вот так вот:

Context db = new Context();
            var teams = db.Teams.ToList();
            foreach(Team t in teams)
            {
                Console.WriteLine("Team named is {0} ", t.Name);
                foreach(Player p in t.Players)
                    Console.WriteLine("In team {0}, have player {1}", t.Name, p.Name);
            }
            Console.ReadKey();

То есть я в в варовскую переменную гружу лист команд, и к ней всё подтягивается. И когда я перебираю всё в цикле всё норм, но если я буду грузить не лист, а iqueryable, то есть вот так вот: var teams = db.Teams; В таком случае будет ошибка:

Объясните пожалуйста, почему так происходит? Почему я не могу получить из такого вида данных коллекцию игроков?

Answer 1

Как правильно заметил tym32167, "необходимо материализовать запрос в коллекцию", из сырого IQueryable. Из-за ленивой загрузки, данные в IQueryable не подгружаются полностью, пока их не представишь в коллекцию. Например в List. Подробней можно почитать тут.

upd. Возможно, вам поможет такой код:

var players = db.Teams
    .Include(x=>x.Players) // включает в себя игроков (и тогда их можно прочитать из IQueryable и/или преобразовать в список)

Либо собрать только игроков, сразу в коллекцию:

var players = db.Teams
    .SelectMany(x=>x.Players)
    .ToList();

В любом случае, оставлять запрос как IQueryable, для передачи куда-либо, не рекомендуется.

READ ALSO
Entityframework codefirst

Entityframework codefirst

ЗдравствуйтеСоздал консольное приложение

168
Ошибка типа данных в xml

Ошибка типа данных в xml

После десериализации xml документа в виде строки полученной с WCF сервера, иногда возникает ошибка

187
ArrayList<Bike>.Sort c#

ArrayList<Bike>.Sort c#

В результате чего не сортируется лист велосипедов по ценеВыбрасывается ошибка

203