Является ли проектирование ленивым, нетерпеливым или явным в рамках сущности? - PullRequest
3 голосов
/ 15 апреля 2011

Я узнал о отложенной загрузке, нетерпеливой загрузке с помощью .include и явной загрузке с помощью .load (), но меня смущает то, что вы проецируете запрос и явно запрашиваете свойство навигации, подобное этому:

var address = from a in context.Addresses
              select {a, Name = a.Contact.Name}

Здесь Контакт - это свойство навигации в Адреса, которое ссылается на сущность Контакта.

Я пробовал включать и выключать ленивую загрузку, и она работает в обоих направлениях.Интересно, когда я запрашиваю свои данные, как это, я жду загрузки или отложенной загрузки?Насколько я понимаю, к базе данных будет сделан только один запрос, что означает, что она активно загружается, за исключением того, что в этом случае будет загружаться только свойство «Имя» сущности «Контакт», а не вся сущность «Контакт», если бы я использовал контекст.Addresses.include ( "Контакт")?Делает ли это такой запрос более эффективным, чем стремительная загрузка с помощью .include ()?

Будем благодарны за некоторые разъяснения.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Ленивая загрузка, активная загрузка и явная загрузка работает в наиболее распространенных сценариях. Проекция является заменой для быстрой загрузки, поскольку она также может загружать связанные объекты одним запросом. Использование проекции имеет смысл, если вам нужно загрузить объекты с каким-то сложным запросом, потому что в этих случаях не работает энергичная загрузка. Используйте проекцию, если вам нужно:

  • Любой тип объединения или агрегирования в запросе linq. Как я знаю, Include игнорируется, когда вы начинаете использовать ручные объединения.
  • Любой вид фильтрации или сортировки в свойстве навигации. Include может загружать только связанные объекты из свойства навигации без какой-либо сортировки. Как только вам нужно применить любое условие или заказ по связанным сущностям, вы не можете использовать Include, и вы должны использовать проекцию.
1 голос
/ 15 апреля 2011

Это ленивое выражение, так как оно не будет выполняться, пока что-то не будет перечислено по адресу.

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

Если вы обращаетесь к a.Contact.Name, а не к Name, вы, скорее всего, вызовете другой удар по базе данных, так как не пытались загрузить объект Contact Address,Вы специально выбрали и спроецировали свойство Name на анонимный объект.

...