2

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

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

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

那么什么情况是有意义的,当编译的查询返回 IQueryable 时,该查询在向 Sql-Server 请求之前无法修改。所以在我看来,我可以同样出色地返回列表。

感谢您的回答!

4

2 回答 2

0

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

于 2011-09-16T14:13:46.000 回答
0

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

真正的答案是:剖析它;您可以挂钩.Log查看 TSQL,例如:

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

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

于 2010-04-26T11:32:33.123 回答