假设我的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();
我只是想知道它会在运行时生成什么查询....如何查看它是从VS2010 IDE生成什么查询当我们在调试模式下运行代码....请一步步指引我。
这里没有太多可看的-它将只选择Category
表中的所有字段,因为您调用了AsEnumerable
,因此将Category
表中的所有数据提取到内存中。之后你就进入了物体空间。好吧,这取决于this.GetProducts()
做什么-我猜它使另一个EF查询获取结果到内存中。如果是这样的话,我强烈建议你用这个代码和你的GetProducts
方法的代码发布另一个问题,这样我们就可以看看并以更优化的方式重写它。(除此之外,您正在投影到映射实体Model.Category
上,这再次不会(也不应该)与链接到实体一起工作。)
在阅读你的查询之前,我建议做这样的事情:
string sqlQueryString = ((ObjectQuery)qry).ToTraceString();
但这将不起作用,因为你是混合linq到实体与linq到对象,你实际上会有几个查询执行的情况下GetProducts
查询EF。您可以使用EF查询分离该部分,并查看如下SQL:
string sqlString = nwEntitiesContext.CategorySet.ToTraceString();
,但正如我之前提到的,这只会选择Categories
表中的所有内容。
在您的情况下(除非您以一种激烈的方式重写代码),您实际上希望看到在执行代码并枚举查询结果时对DB运行了哪些查询。看看这个问题:实体框架执行的精确sql查询
你的选择是SQL Server Profiler
和实体框架分析器。您也可以尝试LinqPad
,但总的来说,我仍然建议您更详细地描述您的查询正在做什么(并且最有可能在继续之前以更优化的方式重写它们)。
试试Linqpad
这会产生SELECT * FROM Categories
。仅此而已。一旦你调用了AsEnumerable
,你就进入了链接到对象的状态,并且没有办法返回到链接到实体(AsQueryable
不这样做)。
如果您想查看生成了什么查询,请使用SQL Profiler或本文中描述的任何方法。