gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:04 27 4
gpt4 key购买 nike

我有点不知所措,为什么我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com