性能比较的问题 - 在.Count之间的MVC视图(Perfomance issue - .Coun

2019-10-30 23:16发布

对于几页我用.Count一个内部foreach循环

@model ICollection<Item>
foreach(var item in Model)
{
    @item.Flight.FlightReservations.count
}

由于延迟加载的EF使往返于数据库这一点。

现在,我要使用此或LINQ版本解决这个问题:包括(“List.Flight.FlightReservations”)

这样做使我的加载甚至dbSet长于那些需要foreach往返

如何能只有1对象的I“负荷”的部分?

我想用context.Items.Single(p => p.id == id).Include(.....)只装1项完全于是我。

或者这方面的任何其他解决办法? (A办法迫使负载item.List.item2.List内部控制器)

任何建议,欢迎:)谢谢

编辑 :现在使用

Where(..).ToDictionary(item => item, item => item.Flight.FlightReservations.Count); 还注意到添加索引到我的“聚集索引”表帮一点。 仍然缓慢,虽然

var f = _pr.FindBy(duifid);
var result = (from p in f.IngeschrevenVluchten
              select new PrestatieModel
              {
                 Eindpos = p.Eindpositie, 
                 Locatie = p.Vlucht.Locatie.Naam, 
                 AantalInschrijvingen = p.Vlucht.Inschrijvingen.Count(), 
                 Vlucht = p.Vlucht
              });

此查询执行速度非常快,使得IEnumerable<Model> 。 但它仍然加载很慢,一旦发送到视图。

return PartialView(result);

Answer 1:

下面是一些提示,EF的速度:

1-使用预产生的映射视图 。 之前的实体框架可以执行一个查询或更改保存到数据源,它必须产生一组映射视图来访问数据库。 因为映射视图生成是在执行第一个查询的总成本的一部分显著,实体框架,您可以预先生成映射视图,包括他们在编译的项目。

2 -不要创建的新实例DbContext的每一个地方,而不是使用Ioc创建和维护DbContext实例。

3-如果你只想要然后显示数据转实体tracking.This的查询只读场景大量的实体时,可能会导致更好的性能。

var someData = context.SomeEntity.Where(...).AsNoTracking().ToList(); 

4-通过使用从数据库中获取数据时,减少往返数据库IncludeToList()方法。

context.Items.Single(p => p.id == id).Include(t => t.List1.Select(l => l.List2)).ToList();

5如果你有数据使用量巨大Paging

var list = context.Items.AsNoTracking().Select(x => x.Content).Skip(15).Take(15).ToList();


文章来源: Perfomance issue - .Count in MVC view