В противоречивый блог Сегодня, Hackification понтификатами на то, что, как представляется, ошибка в новом 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-to-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();
Вау! LINQ-to-Entities внезапно
говорит мне, что дочерний объект существует,
несмотря на то, что говорил мне ранее, что это
не сделал!
Моя первоначальная реакция состояла в том, что это должно быть ошибкой, но после дальнейшего рассмотрения (и при поддержке команды ADO.NET ) я понял, что это поведение было вызвано тем, что Entity Framework не ленив загрузка подзапроса Orders, когда Алиса извлекается из текста данных.
Это потому, что заказ является запросом LINQ-To-Object:
var order = ( from o in alice.Orders
where o.Item == "Item_Name"
select o ).FirstOrDefault();
И не имеет никакого доступа к текстовому тексту данных, пока его цикл foreach:
foreach( var order in data.Orders )
Доступ к текстовому тексту данных.
LINQ-To-SQL фактически создал лениво загруженные свойства для Orders, поэтому при обращении к ним будет выполнен другой запрос, LINQ to Entities оставляет за вами право вручную получать связанные данные.
Так вот, я не большой поклонник ORM, и именно поэтому причина. Я обнаружил, что для того, чтобы все данные, которые вы хотите подготовить, были у вас под рукой, они многократно выполняют запросы за вашей спиной, например, что вышеупомянутый запрос linq-to-sql может выполнить дополнительный запрос для каждой строки клиентов для получения заказов. .
Однако EF, не делающий этого, кажется, в основном нарушает принцип наименьшего удивления. Хотя это технически правильный способ сделать что-то (вы должны выполнить второй запрос для получения заказов или получить все из вида), он не ведет себя так, как вы ожидаете от ORM.
Итак, это хороший дизайн фреймворка? Или Microsoft задумалась над этим для нас?