В настоящее controversial blog post, Hackification понтификатами на то, что, как представляется, ошибка в новом LINQ В рамках Entities:LINQ To Entities и Ленивый Загрузка
Предположим, я ищу для клиента:
var alice = data.Customers.First(c => c.Name == "Alice");
Хорошо, что хорошо работает. Теперь давайте посмотрим , если я могу найти одну из своих заказов:
var order = (from o in alice.Orders where o.Item == "Item_Name" select o).FirstOrDefault();
LINQ к SQL будет найти дочернюю строку. LINQ-to-Entities будет молча возвращаться ничего.
Теперь давайте предположим, что я перебирать все заказы в базе данных:
foreach(var order in data.Orders) { Console.WriteLine("Order: " + order.Item); }
А теперь повторю свой поиск:
var order = (from o in alice.Orders where o.Item == "Item_Name" select o).FirstOrDefault();
Wow! LINQ-to-Entities внезапно говорит мне, что дочерний объект существует, , несмотря на то, что раньше я говорил, что он не сделал!
Моя первая реакция была, что это должно было быть ошибка, но после дальнейшего рассмотрения (и backed up by the ADO.NET Team), я понял, что такое поведение было вызвано Entity Framework не отложенной загрузки Заказы подзапрос, когда Алиса вытягивается из DataContext.
Это потому, что порядок является LINQ-To-объект запроса:
var order = (from o in alice.Orders
where o.Item == "Item_Name"
select o).FirstOrDefault();
И не имеет доступа к DataContext в любом случае, в то время как его Еогеасп цикла:
foreach(var order in data.Orders)
ли доступ к DataContext ,
LINQ-To-SQL фактически создал ленивые загружаемые свойства для ордеров, так что при обращении к нему, выполнив другой запрос, LINQ to Entities предоставит вам возможность вручную получать связанные данные.
Теперь я не большой поклонник ОРМ, и это точно причина. Я обнаружил, что для того, чтобы все данные, которые вы хотите готовить под рукой, они многократно выполняют запросы за вашей спиной, например, что указанный выше запрос linq-to-sql может запускать дополнительный запрос для каждой строки Клиентов для получения заказов ,
Однако EF, не делая этого, по-видимому, нарушает принцип наименьшего удивления. Хотя это технически правильный способ сделать что-то (вы должны запустить второй запрос для получения заказов или получить все из представления), он не ведет себя так, как вы ожидали бы от ORM.
Итак, это хороший дизайн каркаса? Или Microsoft думает об этом для нас?
Согласен, этот пост в блоге не полностью информирован. Я считаю, что они должны были потратить немного времени на изучение L2E, прежде чем критиковать его так, как будто они решили, что им это не нравится, прежде чем они написали статью, вызвав огромное волнение, потому что они не знали, что им нужно было загрузить() ... – naspinski 2009-01-06 07:07:54