我们在使用。tolist命令时遇到了很多麻烦,它在VB中使用。asp.net与MVC。. NET web项目。
我们的数据库中有~2000个条目,我们使用LINQ命令来选择和排序这2000个条目。通过. tolist方法将结果转换为分页器和网格构建器的列表。问题是,. tolist占用的时间太长了(我们说的是执行40-60秒),所以我们的网站看起来很慢。
我们在数据库上测试了等效的SQL命令,它的响应很快。这不是命令或慢速数据库服务器的问题。我们尝试了一个更快的IEnumrable巫婆,但我们需要它在最后的。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命令马上执行
谢谢。汤姆
当然,LINQ命令立即"执行",因为它只是表示查询。查询只在迭代一次时执行,这正是ToList
方法所做的。
我建议您在寻呼机中使用Skip
和Take
操作符来缩小从数据库查询的结果。这样,您只需请求10或20个元素或任何您需要的元素,从而获得更流畅的体验。
我认为最好在查询中分页,而不是一次取出所有数据,使用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();
如果可能的话,配上一些目标明确的缓存,应该会提供更快捷的用户体验。
当您说"数据库上的等效SQL命令并且它响应迅速"-是LINQ代码生成的实际SQL语句还是逻辑等效的手工编码SQL ?
因为linq生成的代码可能不是非常高效。
对于这样的东西,在分析器中运行代码通常是有用的。可能有很多东西减慢了速度……网络、内存、对象大小等
还可以创建自己的列表,并将IEnumerable的值复制到其中。如果可能的话,我建议将您的网格更改为接受IEnumerable。
要确认与查询执行相反的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并检查执行计划以确认。