我使用Entity Framework创建了一个开箱即用的项目(ASP.NET Core 4.6.2)并添加了一个简单的数据模型(书)。这本书有名称,描述和价格。我已将一些示例数据添加到我的数据库(SQL Server 2016)以测试视图的速度。 linq查询花了不到一秒的时间来返回58K记录。然后,控制器立即将结果传递给视图。视图旋转约3分钟,然后超时并返回502.3 Bad Gateway
。
我的印象是Core非常快,可以处理非常大的数据集(超过2-6M)。如果您需要代码示例,请执行以下操作:
BooksController.cs:
var books = db.Books.ToList();
return View(books);
Index.cshtml:
@model IEnumerable<TestCoreApp.Models.Book>
<h2>Index</h2>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
答案 0 :(得分:1)
系统只有代码允许的强大。两种简单/快速的方法可以改善响应时间:
1)使视图异步。
2)将数据库查询标记为&#34; No Tracking&#34;当没有对当前视图中的数据进行任何更改时。将此标志添加到查询中会使上下文不跟踪对数据的更改。因此,如果你进行了更新,context.SaveChanges()就不会保存它们。如果您的观点没有任何编辑功能,那么它应该始终存在。
从我正在处理的应用中使用我自己的索引视图:
public async Task<IActionResult> Index(bool hideDisabledUsers = true) {
ViewData["hideDisabledUsers"] = hideDisabledUsers;
var employeeList = _context.Employees
.OrderBy(e => e.LastName);
if (hideDisabledUsers)
employeeList = employeeList.Where(e => e.AccessLevel != AccessType.Disabled);
return View(await employeeList.AsNoTracking().ToListAsync());
}
请注意已更改的方法签名和返回类型,以及如何在步骤中构建LINQ查询。在.ToListAsync()
其他人可能能够提供更多关于性能的技术答案,或者有更多方法来提高性能,但使用这两种方法应该会显着改善您的测试。