.NET .ToList函数的方式太慢了

时间:2011-04-15 17:51:11

标签: sql vb.net linq linq-to-sql entities

我们在.ToList命令中遇到了很多麻烦,它在VB.NET中用于MVC ASP.NET Web项目。

我们的数据库中有大约2000个条目,我们使用LINQ命令来SELECT和ORDER 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命令立即执行。

非常感谢。 汤姆

5 个答案:

答案 0 :(得分:15)

当然,LINQ命令会立即“执行”,因为它只是代表查询。只有在迭代它时才执行查询,这正是ToList方法的作用。

我建议您使用寻呼机中的SkipTake运算符来缩小从数据库中查询的结果范围。这样做,您只需要10或20个元素或任何您需要的元素,从而获得更顺畅的体验。

答案 1 :(得分:8)

我认为最好在查询中进行分页,而不是使用SkipTake一次性获取所有数据。

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).Skip(pageSize * pageIndex).Take(pageSize).ToList();

与一些目标明确的缓存配合使用(如果可能)应该提供更快捷的用户体验。

答案 2 :(得分:2)

当您说“数据库上的等效SQL命令并且它快速响应”时 - 是LINQ代码生成的实际SQL语句还是逻辑上等效的手动编码SQL?

因为LINQ生成的代码可能效率不高。

答案 3 :(得分:1)

对于这样的东西,在分析器中运行代码通常很有用。可能有任何数量的东西放缓......网络,内存,对象大小等。

您还可以创建自己的列表并将IEnumerable值复制到其中。如果可能,我建议您更改网格以接受IEnumerable。

答案 4 :(得分:1)

要确认ToList的性能而不是查询执行,请添加一个语句并进行比较:

  //this call iterates a query, causing a database roundtrip.
List<Row> result = query.ToList();
  //this call generates a new List by iterating the old List.
result = result.ToList();

查看您的查询,我怀疑您需要一个codeClient,以及对.Include调用中提到的每个表的索引。抓取生成的sql并检查执行计划以确认。