慢视图建设

时间:2015-03-24 13:11:30

标签: asp.net-mvc entity-framework

我正在将旧的asp.net表单应用程序转换为MVC。我遇到了一个显示搜索结果的障碍。

我有一个Classes,Class Details,Rosters和Class tutorials的实体框架模型。

Entity Framework Model

我有一个搜索页面,我希望按所选课程显示所有课程详细信息。

查看:

@using System.Diagnostics
@model IEnumerable<SafetyReports.Models.DataModel.ClassDetails>

<div>
    <table>
        <tr>
            <th>
                Class Date
            </th>
            <th>
                Location
            </th>
            <th>
                Region
            </th>
            <th>
                # of Attendees
            </th>
        </tr>
        @foreach (var c in Model)
        {
            Debug.WriteLine(c.ClassDetailID);
            <tr>
                <td>
                    @c.ClassDate
                </td>
                <td>
                    @c.Location
                </td>
                <td>
                    @c.Region
                </td>
                <td>
                    @c.ClassRosters.Count
                </td>
                <td>
                    <input type="button" value="Detail" onclick="alert(@c.ClassDetailID)"/>
                </td>
            </tr>
        }
    </table>
</div>

控制器:

public PartialViewResult SelectCourse(string id)
        {
            var e = new Entities();
            var i = e.ClassDetails.Where(x => x.ClassID.ToString() == id).ToList();
            return PartialView("_ClassesDetail", i);
        }

我的问题是,每2-3节课似乎需要大约1秒钟。我有一个类型有1300条记录,返回视图大约需要5-6分钟。我究竟做错了什么?在asp.net表单应用程序中,我有一个gridview,如果那么长,它会在几秒钟内返回相同数量的数据。它不是使用EF,只是一个sqldatasource。这可能是延迟加载吗?

2 个答案:

答案 0 :(得分:0)

我发现了我的问题,我的相关对象是延迟加载的,我修复了包含这些对象的问题:

var i = e.ClassDetails.Where(x => x.ClassID == id).Include(x=>x.ClassInstructors).Include(x=>x.ClassRosters).ToList();

答案 1 :(得分:0)

首先,如前所述,使用int而不是字符串来识别&#39; id&#39;将加快你的EF查询。

这是加速视图渲染的一种方法(或者至少使其更清晰):

在视图中用简单的替换所有@foreach循环:

 //here Razor will automatically repeat you model displayTemplate for
 //each element of your IEnumerable 
@Html.DisplayForModel()

然后为您的模型定义显示模板

〜/查看/共享/ DisplayTemplates / ClassDetails.cshtml

@model SafetyReports.Models.DataModel.ClassDetails          
                <tr>
                    <td>
                        @Model.ClassDate
                    </td>
                    <td>
                        @Model.Location
                    </td>
                    <td>
                        @Model.Region
                    </td>
                    <td>
                        @Model.ClassRosters.Count
                    </td>
                    <td>
                        <input type="button" value="Detail" onclick="alert(@Model.ClassDetailID)"/>
                    </td>
                </tr>