visual studio 2010 - LINQ and Generated sql



假设我的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或本文中描述的任何方法。

相关内容

  • 没有找到相关文章

最新更新