Asp.net mvc ASP.NET MVC、实体框架和性能
我对性能有问题,不了解EF的行为。我使用ASP.NET MVC应用程序,模型中有以下代码:Asp.net mvc ASP.NET MVC、实体框架和性能,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我对性能有问题,不了解EF的行为。我使用ASP.NET MVC应用程序,模型中有以下代码: public List<Portal> PortalListWithCategories() { List<Portal> q = new List<Portal>(); q = (from i in _dataContext.Portals.Include("Categories").Include("Ideas") where i.Categ
public List<Portal> PortalListWithCategories()
{
List<Portal> q = new List<Portal>();
q = (from i in _dataContext.Portals.Include("Categories").Include("Ideas") where i.Categories.Count > 0 orderby i.DefaultPortal descending select i).ToList();
return q;
}
据我所知,EF应该执行批处理请求并返回包含嵌套集合“类别”和“想法”的门户集合
但从我的观点来看,我有以下几点:
@foreach (var category in portal.Categories.Where(n => n.Ideas.Count > 0 && n.Portals.Any(g => g.PortalID == portal.PortalID)))
{
if ((from e in category.Ideas where e.Portals.Any(t => t.PortalID == portal.PortalID) select e).Count() > 0)
{
string categoryLink = Url.RouteUrl("Full", new { PortalID = portal.PortalID, CategoryID = category.CategoryID, action = "Ideas" });
List<NEOGOV_Ideas.Models.Ideas> ideas = category.Ideas.Where(o => o.Portals.Any(p => p.PortalID == portal.PortalID) && o.Categories.Any(h => h.CategoryID == category.CategoryID)).OrderByDescending(k => k.CreatedDateTime).ToList();
<div class="grid_4">
<h4>
<a href="@categoryLink">@category.CategoryName<span class="count_link"> (@ideas.Count())</span>
<span class="follow_link">»</span></a></h4>
<ul>
@foreach (var idea in ideas.Take(3))
{
string ideaLink = Url.RouteUrl("IdeaShort", new { id = idea.IdeaID });
if (!idea.IdeaTypeReference.IsLoaded) { idea.IdeaTypeReference.Load(); }
string cssclass = " class=\"" + idea.IdeaType.TypeName.ToLower() + "\"";
<li><a href="@ideaLink" @cssclass>@idea.Title</a></li>
}
</ul>
</div>
if (i == 2)
{
<div class="clear">
</div>
}
i++;
}
}
@foreach(portal.Categories.Where(n=>n.Ideas.Count>0&&n.Portals.Any(g=>g.PortalID==portal.PortalID)))
{
if((在category.Ideas中的e.Portals.Any(t=>t.PortalID==portal.PortalID)中选择e.Count()>0)
{
字符串categoryLink=Url.RouteUrl(“Full”,新的{PortalID=portal.PortalID,CategoryID=category.CategoryID,action=“Ideas”});
列出ideas=category.ideas.Where(o=>o.Portals.Any(p=>p.PortalID==portal.PortalID)和&o.Categories.Any(h=>h.CategoryID==category.CategoryID)).OrderByDescending(k=>k.CreatedDateTime.ToList();
@foreach(在ideas.Take(3))中选择idea
{
字符串ideaLink=Url.RouteUrl(“IdeaShort”,new{id=idea.IdeaID});
如果(!idea.ideatyperence.IsLoaded){idea.ideatyperence.Load();}
字符串cssclass=“class=\”+idea.IdeaType.TypeName.ToLower()+“\”;
}
如果(i==2)
{
}
i++;
}
}
据我所知,我不应该对DB有新的请求,但我有很多。为什么?
[新增]
我发现这根绳子
(来自category.Ideas中的e,其中e.Portals.Any(t=>t.PortalID==portal.PortalID)选择e.Count()
向数据库生成许多请求,如:
exec sp_executesql N'SELECT
[extend2]。[PortalID]作为[PortalID],
[Extent2]。[PortalName]作为[PortalName],
[Extent2][DefaultPortal]作为[DefaultPortal]
来自[dbo]。[PortalIdeas]作为[Extent1]
将[dbo].[Portals]作为[Extent1].[PortalID]=[Extent2].[PortalID]上的[Extent2]进行内部联接
其中[Extent1].[IdeaID]=@EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=5618
为什么Count()会发生这种情况
第二个问题是如何正确创建它?因为
e.Portals
未加载,并且在您的foreach
循环中,EF必须往返数据库才能获取Portals
以获取Idea。您也应该在查询中包含
想法
我没有对此进行测试,但我认为您应该添加.Include(“Ideas.Portals”)
(或者如果您使用EF 4.1,请使用System.Data.Entity添加,并使用.Include(c=>c.Ideas.Portals)
)
@foreach (var category in portal.Categories.Where(n => n.Ideas.Count > 0 && n.Portals.Any(g => g.PortalID == portal.PortalID)))
{
if ((from e in category.Ideas where e.Portals.Any(t => t.PortalID == portal.PortalID) select e).Count() > 0)
{
string categoryLink = Url.RouteUrl("Full", new { PortalID = portal.PortalID, CategoryID = category.CategoryID, action = "Ideas" });
List<NEOGOV_Ideas.Models.Ideas> ideas = category.Ideas.Where(o => o.Portals.Any(p => p.PortalID == portal.PortalID) && o.Categories.Any(h => h.CategoryID == category.CategoryID)).OrderByDescending(k => k.CreatedDateTime).ToList();
<div class="grid_4">
<h4>
<a href="@categoryLink">@category.CategoryName<span class="count_link"> (@ideas.Count())</span>
<span class="follow_link">»</span></a></h4>
<ul>
@foreach (var idea in ideas.Take(3))
{
string ideaLink = Url.RouteUrl("IdeaShort", new { id = idea.IdeaID });
if (!idea.IdeaTypeReference.IsLoaded) { idea.IdeaTypeReference.Load(); }
string cssclass = " class=\"" + idea.IdeaType.TypeName.ToLower() + "\"";
<li><a href="@ideaLink" @cssclass>@idea.Title</a></li>
}
</ul>
</div>
if (i == 2)
{
<div class="clear">
</div>
}
i++;
}
}