首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET核中未加载的大结果集

ASP.NET核中未加载的大结果集
EN

Stack Overflow用户
提问于 2017-03-20 21:55:09
回答 1查看 1.3K关注 0票数 1

我使用实体框架创建了一个开箱即用的项目(ASP.NET Core4.6.2),并添加了一个简单的数据模型(book)。这本书有名字、描述和价格。我向数据库( Server 2016)添加了一些示例数据,以测试视图的速度。linq查询花了不到一秒时间返回58K记录。然后,控制器立即将结果传递给视图。视图旋转大约3分钟,然后超时并返回一个502.3 Bad Gateway

我的印象是Core非常快,能够处理非常大的数据集(超过2-6米)。如果您需要一个代码示例,下面是:

BooksController.cs:

代码语言:javascript
复制
var books = db.Books.ToList();
return View(books);

Index.cshtml:

代码语言:javascript
复制
@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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 22:28:21

系统只有在其代码允许的情况下才能强大。改进响应时间的两种简单/快速的方法是:

1)使View异步。

2)当不对当前视图中的数据进行任何更改时,将数据库查询标记为“无跟踪”。将此标志添加到查询使其不跟踪对数据的更改。因此,如果您确实进行了更新,context.SaveChanges()将不会保存它们。如果您的视图没有任何编辑功能,那么它应该始终存在。

从我正在开发的应用程序中使用我自己的Index视图:

代码语言:javascript
复制
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()才真正命中数据库

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42914672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档