Linq To Sql: скомпилированные запросы и методы расширения - PullRequest
2 голосов
/ 26 апреля 2010

Я заинтересован, как Linq2Sql обрабатывает скомпилированный запрос, который возвращает IQueryable.

Если я вызываю метод расширения на основе скомпилированного запроса, такого как "GetEntitiesCompiled (). Count ()" или "GetEntitiesCompiled (). Take (x)". Что Linq2Sql делает в фоновом режиме? Это было бы очень плохо, поэтому в этой ситуации я должен написать скомпилированный запрос, например "CountEntitiesCompiled".

Загружает ли он результат (в данном случае «GetEntitiesCompiled ()») в память (сопоставленную с классом сущностей, таким как «ToList ()»)?

Итак, какие ситуации имеют смысл, когда скомпилированные запросы возвращают IQueryable, этот запрос не может быть изменен до запроса к Sql-серверу. Так что, по моему мнению, я могу так же хорошо вернуть список.

Спасибо за ответы!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

Linq2Sql недостаточно умён в таких случаях. Из моего опыта он всегда выполняет скомпилированную часть как есть. В случае GetEntitiesCompiled().Count() он извлечет все записи и затем выполнит в памяти Count().

0 голосов
/ 26 апреля 2010

Насколько я понимаю - если он не может использовать предварительно скомпилированный запрос точно (потому что вы его скомпилировали дальше), он просто запускает его, как любой другой обычный IQueryable запрос - так что он действительно все равно выдаст SELECT COUNT(1) FROM ... (он не должен повторять всю таблицу / что угодно).

Но real ответ: профилируйте его; Вы можете подключить .Log, чтобы увидеть TSQL, например:

myDataContext.Log = Console.Out; // write TSQL to the console

или просто используйте трассировку SQL, чтобы увидеть, что идет вверх и вниз по проводам.

...