对于多个页面,我在.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);
答案 0 :(得分:0)
以下是加速EF的一些提示:
1-使用Pre-Generated Mapping Views。在Entity Framework可以执行查询或保存对数据源的更改之前,它必须生成一组映射视图才能访问数据库。由于映射视图生成是执行第一个查询的总体成本的重要部分,因此实体框架允许您预先生成映射视图并将它们包含在已编译的项目中。
2-不要在每个地方创建DbContext
的新实例,而是使用Ioc
来创建和维护DbContext
实例。
3-如果您只想要显示数据,则转向实体跟踪。在只读方案中查询大量实体时,这可能会带来更好的性能。
var someData = context.SomeEntity.Where(...).AsNoTracking().ToList();
4-使用Include
和ToList()
方法从数据库获取数据时减少往返数据库。
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();