.NET .ToList函数的速度太慢

| 我们在使用.ToList命令时遇到了很多麻烦,该命令已在MB ASP.NET Web项目的VB.NET中使用。 我们的数据库中有〜2000个条目,我们使用LINQ命令对2000个条目进行选择和排序。通过我们的寻呼机和网格生成器的.ToList方法,结果将转换为列表。问题是,.ToList花费的时间太长(我们正在谈论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命令可以立即执行。 非常感谢。 汤姆     
已邀请:
我认为最好在查询中分页而不是使用ѭ1in和page2ѭ一次性获取所有数据。
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();
这样,再结合一些针对性强的缓存(如果可能的话),应该可以提供更轻松的用户体验。     
当然,LINQ命令\“ executes \”可以立即执行,因为它仅表示查询。该查询仅在您对其进行迭代后才执行,这正是
ToList
方法所做的。 我建议您在寻呼机中使用
Skip
Take
运算符来缩小从数据库查询的结果的范围。这样,您只需要10或20个元素或任何您需要的元素,就可以带来更加流畅的体验。     
当您说“数据库上的等效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并检查执行计划以确认。     

要回复问题请先登录注册