性能问题 - MVC视图中的.Count

时间:2013-01-17 01:16:38

标签: asp.net-mvc entity-framework lazy-loading dbset

对于多个页面,我在.Count循环

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

由于延迟加载,EF为此进行数据库往返。

现在我想通过使用this或linq版本解决这个问题: 包括( “List.Flight.FlightReservations”)

这样做会使我的dbSet加载时间比foreach往返

更长

如何'加载'仅1个对象的部分?

我想使用context.Items.Single(p => p.id == id).Include(.....) 所以我只完全加载1个项目。

或者其他任何解决方案? (强制加载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);

1 个答案:

答案 0 :(得分:0)

以下是加速EF的一些提示:

1-使用Pre-Generated Mapping Views。在Entity Framework可以执行查询或保存对数据源的更改之前,它必须生成一组映射视图才能访问数据库。由于映射视图生成是执行第一个查询的总体成本的重要部分,因此实体框架允许您预先生成映射视图并将它们包含在已编译的项目中。

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

3-如果您只想要显示数据,则转向实体跟踪。在只读方案中查询大量实体时,这可能会带来更好的性能。

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();