我有兴趣,Linq2Sql如何处理一个返回IQueryable的编译查询。
如果我根据编译的查询调用扩展方法,如“GetEntitiesCompiled()。Count()”或“GetEntitiesCompiled()。Take(x)”。 Linq2Sql在后台做了什么?这将是非常糟糕的,所以在这种情况下我应该编写一个编译的查询,如“CountEntitiesCompiled”。
他是否将结果(在本例中为“GetEntitiesCompiled()”)加载到内存中(映射到像“ToList()”这样的实体类)?
那么什么情况才有意义,当编译的查询返回IQueryable时,在查询到Sql-Server之前,该查询无法修改。 所以在我看来,我可以作为良好的回报列表。
感谢您的回答!
答案 0 :(得分:0)
据我所知 - 如果它无法使用预先编译的查询完全(因为你已经进一步编写了它),它就像任何常规>一样运行它em> IQueryable
查询 - 所以它确实仍然会发出SELECT COUNT(1) FROM ...
(它不应该迭代整个表/无论如何)。
但真正的答案是:个人资料;您可以挂钩.Log
以查看TSQL,例如:
myDataContext.Log = Console.Out; // write TSQL to the console
或者只是使用SQL跟踪来查看电汇上下的内容。
答案 1 :(得分:0)
Linq2Sql在这种情况下不够智能。根据我的经验,它总是按原样执行编译部分。如果是GetEntitiesCompiled().Count()
,它将获取所有记录,然后执行内存中Count()
。