开发者

LINQ and Generated sql

开发者 https://www.devze.com 2023-03-01 07:10 出处:网络
suppose my LINQ query is like var qry = from c in nwEntitiesContext.CategorySet.AsEnumerable() let products = this.GetProducts().WithCategoryID(c.CategoryID)

suppose my LINQ query is like

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

           };  
 return qry.AsQueryable();  

i just want to know what query it will generate at runtime....how to see what query it is generating from VS2010 IDE when we run the code in debug mode....guide me step by step.


There is not much to see here - it will just select all fields from the Category table since you call AsEnumerable thus fetching all the data from the Category table into memory. After that you are in object space. Well, depending on what this.GetProducts() does - and my guess it makes another EF query fetching the results into memory. If that's the case, I would strongly recommend you to post another question with this code and the code of your GetProducts method so that we can take a look and rewrite this in a more optimal way. (Apart from this, you are projecting onto a mapped entity Model.Category which again won't (and should not) work with Linq-to-Entities.)

Before reading into your query I was going to recommend doing something like this:

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

But that won't work since you are mixing Linq-to-Entities with Linq-to-objects and you will actually have several queries executed in case GetProducts queries EF. You can separate the part with your EF query and see the SQL like this though:

string sqlString = nwEntitiesContext.CategorySet.ToTraceString();

but as I mentioned earlier - that would just select everything from the Categories table.

In your case (unless you rewrite your code in a drastic way), you actually want to see what queries are run against the DB when you execute the code and enumerate the results of the queries. See this question: exact sql query executed by Entity Framework

Your choices are SQL Server Profiler and Entity Framework Profiler. You can also try out LinqPad, but in general I still recommend you to describe what your queries are doing in more detail (and most probably rewrite them in a more optimal way before proceeding).


Try Linqpad


This will produce SELECT * FROM Categories. Nothing more. Once you call AsEnumerable you are in Linq-to-objects and there is no way to get back to Linq-to-entities (AsQueryable doesn't do that).

If you want to see what query is generated use SQL Profiler or any method described in this article.

0

精彩评论

暂无评论...
验证码 换一张
取 消