ASP.NET Core中未加载大型结果集

时间:2017-03-20 21:55:09

标签: asp.net-mvc entity-framework asp.net-core

我使用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>

1 个答案:

答案 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()

之前,查询实际上并未访问数据库

其他人可能能够提供更多关于性能的技术答案,或者有更多方法来提高性能,但使用这两种方法应该会显着改善您的测试。