EF разница между ctx.Object.Select и obj.Select - PullRequest
2 голосов
/ 22 марта 2012

Сегодня я столкнулся с чем-то немного странным.

Я использовал мини-профилировщик для просмотра выполненных SQL-запросов.

Кажется, что при использовании obj.Children.Select (x =>x.Prop1) .SingleOrDefault () выполненный запрос получает ВСЕ столбцы.Однако, используя ctx.Children.Select (x => x.Prop1 && x.IDParent == idObj) .SingleOrDefault () получает только Prop1.

Есть идеи, почему разница?

1 Ответ

2 голосов
/ 22 марта 2012

Поскольку первый запрос выполняется здесь:

obj.Children. ...

И второй запрос здесь оправдывается:

... .SingleOrDefault()

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...