【问题标题】:Linq To Sql: Compiled Queries and Extension MethodsLinq To Sql:编译查询和扩展方法
【发布时间】:2010-04-26 11:23:10
【问题描述】:

我很感兴趣,Linq2Sql 如何处理返回 IQueryable 的编译查询。

如果我根据“GetEntitiesCompiled().Count()”或“GetEntitiesCompiled().Take(x)”之类的已编译查询调用扩展方法。 Linq2Sql 在后台做了什么?这会很糟糕,所以在这种情况下,我应该编写一个像“CountEntitiesCompiled”这样的编译查询。

他是否将结果(在本例中为“GetEntitiesCompiled()”)加载到内存中(映射到“ToList()”之类的实体类)?

那么什么情况下才有意义,当编译查询返回 IQueryable 时,该查询在向 Sql-Server 请求之前无法修改。 所以在我看来,我也可以很好地返回 List。

感谢您的回答!

【问题讨论】:

    标签: linq-to-sql compiled-query


    【解决方案1】:

    据我了解 - 如果它不能使用预编译查询完全(因为您已经进一步编写了它),它只是像任何 常规 一样运行它em> IQueryable 查询 - 所以它确实仍会发出 SELECT COUNT(1) FROM ... (它不应该迭代整个表/任何东西)。

    真正的答案是:分析它;你可以 hook .Log 来查看 TSQL,例如:

    myDataContext.Log = Console.Out; // write TSQL to the console
    

    或者只是使用 SQL 跟踪来查看线路的上下移动。

    【讨论】:

    • DataContext.Log 和 Sql-Profiler 向我展示了编译查询中的完整选择语句,而没有像“Count()”或“Take(x)”这样的扩展方法进行更改...。所以结果确实映射到实体类。对于像“Count()”这样的操作来说,这是一个很大的开销。
    【解决方案2】:

    在这种情况下,Linq2Sql 不够聪明。根据我的经验,它总是按原样执行编译部分。如果是GetEntitiesCompiled().Count(),它将获取所有记录,然后在内存中执行Count()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多