c# - MVC 应用程序中的表连接速度非常慢

标签 c# sql asp.net-mvc linq-to-sql database-performance

我有点不知所措,为什么我的 MVC 应用程序中的一个 ASP View 运行如此缓慢。

我在 Controller 中使用 linq 选择一些数据。这运行得很快:

public ActionResult Progress(int ID)
        {


            var reviewitems = from ri in db.ReviewItems
                         where ri.Enrolment.Course.LearningArea.LearningAreaID == ID && ri.Review.ReviewSeries.StartDate < DateTime.Now && ri.Review.ReviewSeries.EndDate > DateTime.Now && ri.Progress < 2
                         select ri;


            return View("Progress", reviewitems);


        }

然后我在 ASP View 中执行一个 foreach 循环,遍历已传递到 View 的“reviewitem”类型数据的每一行。同样,这很快:

<%foreach (var ri in Model)
  {  %>
<tr>
<td><%= ri.Progress %></td>
</tr>
<%} %>   

我需要更多信息来显示,所以我需要连接到“Review”表(它再次给出快速结果),然后连接到“Student”表。这就是问题所在,它开始花费 30 秒以上:

 <%foreach (var ri in Model)
  {  %>
<tr>
<td><%= ri.Review.Student.Surname %></td>
</tr>
<%} %>   

每个评论项目都链接到一个独特的学生,所以我不明白为什么要花这么长时间。有谁知道我应该从哪里开始查看它为什么这么慢?大概这与“学生”表(实际上是 SQL Server View )有关,但我可以使用 SQL 在一秒钟内从中选择所有行?

最佳答案

当您编写 LINQ 查询时,直到您需要数据时才真正执行查询(请参阅延迟执行)。直到你通过 ri.Progress 进行 foreach 时,你的第一个数据库调用才会被调用,这是一个单一的调用。

当您随后请求 ri.Review.Student 时,您是在请求额外的数据。所以你调用了数据库。因为您处于 foreach 循环中,所以您正在为该循环中的每个项目对数据库进行一次调用。

这是一个“Linq n+1”问题。要解决它,您应该在一个查询中获取所有数据。您可以填充模型类并强类型化 View ,或者我认为您可以使用 Linq .Include 方法将学生数据包含在选择中

您可以通过启动 SQL Server Profiler 并执行跟踪来查看正在进行的调用

关于c# - MVC 应用程序中的表连接速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944497/

相关文章:

c# - 使用 PostAsJsonAsync 调用 Web API

c# - 在 .NET 中独立运行 C++ 库

c# - .NET UrlEncode 不工作?

sql - 使用 "LIKE"语法进行高效全文搜索的索引

c# - "Error: Cannot Initialize OLE"当我尝试运行 SPA 时?

asp.net-mvc - 过滤器后的 asp.net 核心验证

c# - 将一个字符串换行成多行

c# - 数组中更改的项目是否进入垃圾收集?

sql - 是否可以在 Oracle 中将表名作为参数传递?

sql - 如何在ETL中测试增量数据