【发布时间】:2011-04-15 17:51:11
【问题描述】:
我们在使用 .ToList 命令时遇到了很多麻烦,它在 VB.NET 中与 MVC ASP.NET Web 项目一起使用。
我们的数据库中有大约 2000 个条目,我们使用 LINQ 命令对 2000 个条目进行选择和排序。 .ToList 方法将结果转换为我们的寻呼机和网格构建器的列表。问题是,.ToList 需要 WAY WAY TOO 长(我们说要执行 40-60 秒),所以我们的网站看起来慢得要命。
我们在数据库上测试了等效的 SQL 命令,它响应迅速。这不是命令或慢速数据库服务器的问题。我们尝试了一个 IEnumrable 女巫,它的速度要快得多,但我们的网格最后需要 .ToList 格式的它。 .ToList 有什么问题?有什么我们可以做的吗?
代码如下:
'list = (From c In _entities.XXXXXXXXSet.Include("XXXXXX").Include("XXXXXX") _
Where Not (c.XXXXXX Is Nothing AndAlso c.XXXXXX = String.Empty) _
And c.XXXXXX = codeClient _
And c.XXXXXX > dateLimite _
Order By c.XXXXXX Descending _
Select c).ToList()
我们划分了代码,只留下了 .ToList 函数,而这确实是一直很糟糕的地方。 LINQ 命令立即执行。
非常感谢。 汤姆
【问题讨论】:
-
听起来像是分页/网格工作在导致问题的 .ToList() 调用之后。
-
LINQ 命令不会立即“执行” - 表达式不会被执行,直到 .ToList 导致它被枚举...
-
@Joel:不,我进入了函数,而 .ToList 行实际上需要 30-40 秒才能执行。
-
当您说“等效的 SQL 命令”时,您实际上得到了 LINQ 查询产生的 SQL SELECT,还是您认为的那样?通常,它们几乎不是一回事。
-
查询不会执行,直到你做一些事情来枚举它。 (在这种情况下,调用 ToList() 会枚举它,这就是执行查询的原因)。如果您拆分对 ToList 的调用并连接 SQL Profiler,您可以观察该行为——您将看到查询实际上并没有转到 SQL Server,直到您执行 ToList() 命令(您也可以消除 ToList( ) 调用,然后在列表上运行 foreach —— 你会得到同样的效果,在你迭代之前查询不会真正执行)。
标签: sql vb.net linq linq-to-sql entities