【问题标题】:LINQ and Generated sqlLINQ 和生成的 sql
【发布时间】:2011-04-29 19:26:18
【问题描述】:

假设我的 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 生成什么查询....逐步指导我。

【问题讨论】:

    标签: linq visual-studio-2010 entity-framework-4 linq-to-entities


    【解决方案1】:

    这里没什么可看的——它只会选择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 表中选择所有内容。

    在您的情况下(除非您以激烈的方式重写代码),您实际上希望在执行代码并枚举查询结果时查看对 DB 运行的查询。看到这个问题: exact sql query executed by Entity Framework

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

    【讨论】:

      【解决方案2】:

      试试Linqpad

      【讨论】:

      • 不使用linq pad我们不能看到生成的sql。因为有时数据检索很慢,所以用户肯定想看看 sql 正在生成什么。请指教。
      • @user728750 - 您没有显示 GetProducts() 的代码,但如果您正在执行 EF 查询以获取具有特定 categoryId 的所有产品,这可能会导致对 的数据库调用数据库中的每个 Category。在您调用AsEnumerable 之后,您处于对象空间中(EF 进行了查询并获取了所有类别)。之后,取决于您所做的事情,您确实可以为每个类别进行数据库查询,这将解释您面临的性能问题。您可以通过运行例如检查在 SQL 级别发生了什么。 SQL Profiler(见我的回答)。
      【解决方案3】:

      这将产生SELECT * FROM Categories。而已。一旦您调用 AsEnumerable,您就处于 Linq-to-objects 中,并且无法返回 Linq-to-entities(AsQueryable 不会这样做)。

      如果您想查看生成了什么查询,请使用 SQL Profiler 或this article 中描述的任何方法。

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多