LINQ и сгенерированный sql - PullRequest
       51

LINQ и сгенерированный sql

0 голосов
/ 29 апреля 2011

предположим, что мой запрос LINQ похож на

var qry = from c in nwEntitiesContext.CategorySet.AsEnumerable()  
           let products = this.GetProducts().WithCategoryID(c.CategoryID)  
           select new Model.Category  
           {  
               ID = c.CategoryID,  
               Name = c.CategoryName,  
               Products = new Model.LazyList<Core.Model.Product>(products)  

           };  
 return qry.AsQueryable();  

я просто хочу знать, какой запрос он сгенерирует во время выполнения ... как посмотреть, какой запрос он генерирует из IDE VS2010, когда мы запускаем код в режиме отладки ... проведите меня шаг за шагом

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

Здесь особо не на что смотреть - он просто выберет все поля из таблицы Category, поскольку вы вызываете AsEnumerable, тем самым извлекая все данные из таблицы Category в память. После этого вы находитесь в объектном пространстве. Ну, в зависимости от того, что делает this.GetProducts() - и я предполагаю, что это делает еще один EF-запрос, извлекающий результаты в память. Если это так, я настоятельно рекомендую вам опубликовать еще один вопрос с этим кодом и кодом вашего GetProducts метода, чтобы мы могли взглянуть и переписать его более оптимальным образом. (Помимо этого, вы проецируете на сопоставленную сущность Model.Category, которая снова не будет (и не должна) работать с Linq-to-Entities.)

Перед чтением вашего запроса я собирался порекомендовать сделать что-то вроде этого:

string sqlQueryString = ((ObjectQuery)qry).ToTraceString();

Но это не сработает, так как вы смешиваете Linq-to-Entities с Linq-to-objects, и у вас будет несколько запросов, если GetProducts запросит EF. Вы можете отделить часть с помощью EF-запроса и посмотреть SQL-код следующим образом:

string sqlString = nwEntitiesContext.CategorySet.ToTraceString();

но, как я упоминал ранее - это просто выберет все из таблицы Categories.

В вашем случае (если вы не переписываете свой код радикально), вы действительно хотите увидеть, какие запросы выполняются к БД при выполнении кода, и перечислить результаты этих запросов. Смотрите этот вопрос: точный SQL-запрос, выполненный Entity Framework

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

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

Попробуйте Linqpad

0 голосов
/ 29 апреля 2011

Это даст SELECT * FROM Categories. Ничего более. Как только вы вызываете AsEnumerable, вы попадаете в Linq-to-objects, и вы не можете вернуться к Linq-to-entity (AsQueryable этого не делает).

Если вы хотите увидеть, какой запрос генерируется, используйте SQL Profiler или любой метод, описанный в этой статье .

...