LINQ和生成的sql

LINQ和生成的sql,linq,visual-studio-2010,entity-framework-4,linq-to-entities,Linq,Visual Studio 2010,Entity Framework 4,Linq To Entities,假设我的LINQ查询如下 var qry = from c in nwEntitiesContext.CategorySet.AsEnumerable() let products = this.GetProducts().WithCategoryID(c.CategoryID) select new Model.Category { ID = c.CategoryID,

假设我的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生成的查询…一步一步地指导我

试试看这里没有什么可看的-它只会从类别表中选择所有字段,因为您调用了一个numerable,从而将所有数据从类别表中提取到内存中。之后,您将进入对象空间。嗯,这取决于this.GetProducts的功能——我猜它会生成另一个EF查询,将结果提取到内存中。如果是这样的话,我强烈建议您用这段代码和GetProducts方法的代码发布另一个问题,这样我们可以看一看,并以更优化的方式重写它。除此之外,您正在投影到映射的实体模型.Category上,它同样不会也不应该与Linq to实体一起工作

在阅读您的查询之前,我建议您执行以下操作:

string sqlQueryString = ((ObjectQuery)qry).ToTraceString();
但这是行不通的,因为您将LINQtoEntities与LINQtoObject混合在一起,并且在case-GetProducts查询中实际上会执行几个查询。您可以使用EF查询分离该部分,并查看如下SQL:

string sqlString = nwEntitiesContext.CategorySet.ToTraceString();
但正如我前面提到的,这将从Categories表中选择所有内容

在您的情况下,除非您以一种激烈的方式重写代码,否则您实际上希望在执行代码并枚举查询结果时查看对DB运行的查询。见这个问题:

您可以选择SQL Server探查器和。您也可以试用LinqPad,但总的来说,我仍然建议您更详细地描述您的查询正在做什么,并且在继续之前很可能会以更优化的方式重写它们。

这将生成SELECT*FROM类别。没别的了。一旦调用AsEnumerable,您就处于Linq to对象中,无法返回到Linq to实体,因为Queryable不会这样做


如果要查看生成的查询,请使用SQL Profiler或中描述的任何方法。

如果不使用linq pad,我们无法查看生成的SQL。因为有时候数据检索速度很慢,所以用户肯定希望看到sql生成了什么。请给出建议。@user728750-您没有显示GetProducts的代码,但是如果您正在进行EF查询以获取具有特定categoryId的所有产品,这可能会导致DB中每个类别的DB调用。调用AsEnumerable后,您就在对象空间中,EF进行了查询并获取了所有类别。在这之后,根据您所做的工作,您确实可以对每个类别进行DB查询,这将解释您所面临的性能问题。您可以通过运行SQL Profiler查看我的答案等来检查SQL级别上的情况。