我们在.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命令立即执行。
非常感谢。 汤姆
答案 0 :(得分:15)
当然,LINQ命令会立即“执行”,因为它只是代表查询。只有在迭代它时才执行查询,这正是ToList
方法的作用。
我建议您使用寻呼机中的Skip
和Take
运算符来缩小从数据库中查询的结果范围。这样做,您只需要10或20个元素或任何您需要的元素,从而获得更顺畅的体验。
答案 1 :(得分:8)
我认为最好在查询中进行分页,而不是使用Skip
和Take
一次性获取所有数据。
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并检查执行计划以确认。