Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优化填充嵌套手风琴_C#_Jquery_.net_Performance_Optimization - Fatal编程技术网

C# 优化填充嵌套手风琴

C# 优化填充嵌套手风琴,c#,jquery,.net,performance,optimization,C#,Jquery,.net,Performance,Optimization,我在父->子->孙关系中有三种数据类型,如下所示: Mission -> Activity -> Project 其中包含关系的父ID(即“项目”包含“活动”ID)。我有一些代码用于生成jQuery嵌套的手风琴设置,这样用户可以单击“任务”查看相关的“活动”,然后单击“活动”查看相关的“项目” 我的代码从点击页面获取数据库中的数据,然后填充页面大约需要6秒钟。这太长了,希望尽可能优化我的代码。使用miniprofiler(miniprofiler.com),我可以看到它对数据库进行

我在父->子->孙关系中有三种数据类型,如下所示:

Mission -> Activity -> Project
其中包含关系的父ID(即“项目”包含“活动”ID)。我有一些代码用于生成jQuery嵌套的手风琴设置,这样用户可以单击“任务”查看相关的“活动”,然后单击“活动”查看相关的“项目”

我的代码从点击页面获取数据库中的数据,然后填充页面大约需要6秒钟。这太长了,希望尽可能优化我的代码。使用miniprofiler(miniprofiler.com),我可以看到它对数据库进行了131次调用,其中包含大量重复调用,但我确定原因

非常感谢你能给我的任何帮助

用于获取所有数据并对其进行组织的LINQ查询:

public IEnumerable<MissionWithActivities> GetTierTree()
{
var q = from mission in _context.tMissions
        join activity in _context.tActivities on mission.id equals activity.missionId
        join project in _context.tDefaultEventTypes on activity.id equals project.activityId
        where !project.isRemoved && project.defaultCategoryId == 4
        orderby mission.id, activity.id, mission.name
        select new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory))
        {
            AllowNumericSuffix = project.allowNumericSuffix,
            AttachMilestoneMoniker = project.attachMilestoneMoniker,
            Description = project.description,
            Id = project.id,
            IsReadOnly = project.isReadOnly,
            IsSticky = project.isSticky,
            Name = project.name,
            Sid = project.sid,
            Style = project.style.TryParseEnum<GanttElementStyle>(GanttElementStyle.Unknown),
            TimeStamp = project.createdDT,
            UpdatedTimeStamp = project.updatedDT,
            Activity = new Activity { Id = activity.id, Name = activity.name, Mission = new Mission { Id = mission.id, Name = mission.name } }
        };
var q2 = q.GroupBy(
    e => e.Activity.Mission.Id,
    (mid, events) => new MissionWithActivities
    {
        Mission = events.First().Activity.Mission,
        Activities = events.GroupBy(
            e => e.Activity.Id,
            (aid, events2) => new ActivityWithEvents
            {
                Activity = events2.First().Activity,
                Events = events2
            })
    });
return q2.ToList();
public IEnumerable GetTierTree()
{
var q=来自任务中的_context.t任务
在_context.tractivities on mission.id等于activity.missionId中加入活动
在activity.id等于project.activityId的_context.tDefaultEventTypes中加入项目
其中!project.isRemoved&&project.defaultCategoryId==4
orderby mission.id、activity.id、mission.name
选择新的DefaultEventType(project.tierLevel.TryParseEnum(GanttType.Unknown),DefaultCategoryRepository.CreateFrom(project.tDefaultCategory))
{
AllowNumericSuffix=project.AllowNumericSuffix,
AttachMilestoneMoniker=project.AttachMilestoneMoniker,
Description=project.Description,
Id=project.Id,
IsReadOnly=project.IsReadOnly,
IsSticky=project.IsSticky,
Name=project.Name,
Sid=project.Sid,
Style=project.Style.TryParseEnum(GanttElementStyle.Unknown),
时间戳=project.createdDT,
UpdatedTimeStamp=project.updatedDT,
活动=新活动{Id=Activity.Id,Name=Activity.Name,任务=新任务{Id=Mission.Id,Name=Mission.Name}
};
var q2=q.GroupBy(
e=>e.Activity.Mission.Id,
(mid,事件)=>新任务与活动
{
任务=events.First().Activity.Mission,
Activities=events.GroupBy(
e=>e.Activity.Id,
(aid,events2)=>新活动WithEvents
{
Activity=events2.First().Activity,
事件=事件2
})
});
返回q2.ToList();
}

我最初用于填充数据列表,然后填充嵌套的手风琴的代码:

public void SetTierTree(IEnumerable<MissionWithActivities> tierList)
{
dlMission.DataSource = tierList;
dlMission.DataBind();
}
public void dlMission_ItemDataBound(Object sender, DataListItemEventArgs e)
{
DataListItem item = e.Item;
MissionWithActivities mwa = (MissionWithActivities)item.DataItem;
var dlActivity = (DataList)item.FindControl("dlActivity");
dlActivity.DataSource = mwa.Activities;
dlActivity.DataBind();
var i = 0;
foreach (var project in mwa.Activities)
{
    DataListItem pItem = dlActivity.Items[i];
    var lbCreateNewProject = (LinkButton)pItem.FindControl("lbCreateNewProject");
    lbCreateNewProject.CommandArgument = project.Activity.Id.ToString();
    var dlProject = (DataList)pItem.FindControl("dlProject");
    dlProject.DataSource = project.Events;
    dlProject.DataBind();
    i++;
    var j = 0;
    foreach (var data in project.Events)
    {
        DataListItem lblItem = dlProject.Items[j];
        var lbEditProject = (LinkButton)lblItem.FindControl("lbEditProject");
        var lbRemoveProject = (LinkButton)lblItem.FindControl("lbRemoveProject");
        lbEditProject.CommandArgument = data.Id.ToString();
        lbRemoveProject.CommandArgument = data.Id.ToString();
        j++;
    }
}
}
public void SetTierTree(IEnumerable tierList)
{
dlMission.DataSource=tierList;
dlMission.DataBind();
}
public void dlMission_ItemDataBound(对象发送方,DataListItemEventArgs e)
{
DataListItem项目=e.项目;
MissionWithActivities mwa=(MissionWithActivities)项。数据项;
var dlActivity=(DataList)item.FindControl(“dlActivity”);
dlActivity.DataSource=mwa.Activities;
dlActivity.DataBind();
var i=0;
foreach(mwa.Activities中的var项目)
{
DataListItem pItem=dlActivity.Items[i];
var lbCreateNewProject=(LinkButton)pItem.FindControl(“lbCreateNewProject”);
lbCreateNewProject.CommandArgument=project.Activity.Id.ToString();
var dlProject=(DataList)pItem.FindControl(“dlProject”);
dlProject.DataSource=project.Events;
dlProject.DataBind();
i++;
var j=0;
foreach(project.Events中的var数据)
{
DataListItem lblItem=dlProject.Items[j];
var lbEditProject=(LinkButton)lblItem.FindControl(“lbEditProject”);
var lbRemoveProject=(LinkButton)lblItem.FindControl(“lbRemoveProject”);
lbEditProject.CommandArgument=data.Id.ToString();
lbRemoveProject.CommandArgument=data.Id.ToString();
j++;
}
}
}
这是带有jQuery的.aspx页面(我没有删除.net,所以它不会运行),但我想包含代码供您阅读:

$(document).ready(function () {
        $("html").addClass("js");
        $(".row").mouseover(function () { $(this).addClass("over"); }).mouseout(function () { $(this).removeClass("over"); });
        $('h5').click(function () { $(this).prev(".heading_add").toggle(); });
        $(".row:even").addClass("alt");
        $.fn.accordion.defaults.container = false;
        $(function () {
            $("#acc1").accordion({
                el: ".h",
                head: "h4, h5",
                next: "div",
                initShow: "none"
            });
            $("html").removeClass("js");
        });
    });
<div id="main">
        <ul id="acc1" class="accordion">
        <asp:DataList ID="dlMission" runat="server" style="width:600px;">
        <ItemTemplate>
            <li>
                <h4><%# Eval("Mission.Name") %></h4>
                <div class="inner">
                    <ul>
                    <asp:DataList ID="dlActivity" runat="server">
                    <ItemTemplate>
                        <li>
                          <asp:LinkButton ID="lbCreateNewProject" CausesValidation="false" CssClass="heading_add" runat="server" Text="[ + ] Add New Project Type" OnCommand="lbCreateNewProject_OnCommand" />
                          <h5><%# Eval("Activity.Name") %></h5>
                          <div class="inner">
                          <asp:DataList ID="dlProject" runat="server">
                          <ItemTemplate>
                            <div class="row">
                              <%# Eval("Name") %><div class="action_buttons"><asp:LinkButton ID="lbEditProject" CausesValidation="false" runat="server" Text="Edit" OnCommand="lbEditProject_OnCommand" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<asp:LinkButton ID="lbRemoveProject" CausesValidation="false" runat="server" Text="Remove" OnCommand="lbRemoveProject_OnCommand" /></div><br />
                            </div>
                          </ItemTemplate>
                          </asp:DataList>
                          </div>
                        </li>
                    </ItemTemplate>
                    </asp:DataList>
                    </ul>
                </div>
            </li>
        </ItemTemplate>
        </asp:DataList>
        </ul>
    </div>
$(文档).ready(函数(){
$(“html”).addClass(“js”);
$(“.row”).mouseover(函数(){$(this.addClass(“over”);}).mouseout(函数(){$(this.removeClass(“over”);});
$('h5')。单击(函数(){$(this.prev(“.heading_add”).toggle();});
$(“.row:偶数”).addClass(“alt”);
$.fn.accordion.defaults.container=false;
$(函数(){
$(“acc1”).手风琴({
el:“.h”,
标题:"h4,h5",,
下一个:“div”,
initShow:“无”
});
$(“html”).removeClass(“js”);
});
});


出于好奇,我正在使用jQuery.nestedAccordion.js插件来实现这一点。

我找到了我所经历的缓慢的主要原因,这与LINQ的工作方式有关。我在LINQ查询中的主要问题是:

DefaultCategoryRepository.CreateFrom(project.tDefaultCategory)
CreateFrom函数导致LINQ获取与扩展的DefaultCategory相关的所有数据。我不知道LINQ会从树上一路抓住每一段关系,并返回它,不管它是否被使用。您可以在此处阅读更多信息:

MiniProfiler仍然说有131次重复调用,但我认为这与.Net的运行方式有关,如果我同意的话