【发布时间】:2015-10-14 07:20:41
【问题描述】:
我有一个链接到其他实体的“父”实体,在加载列表时,由于所有连接而超时,所以我禁用了 LazyLoading。
它一直运行良好,但现在我需要从子实体中检索一个字段。所以我用 .Include() 将实体包含在查询中,加载时间太长。
这些是实体。 Coded 就像是从其他类创建的树关系的摘要。
public partial class Coded
{
public int CodeId { get; set; }
public int Maters_MaterId { get; set; }
public int Levels_LevelId { get; set; }
public virtual Mater mater { get; set; }
public virtual Level level { get; set; }
public virtual Sublevel sublevel { get; set; }
...
}
public partial class Mater
{
public int MaterId { get; set; }
public string name { get; set; }
}
public partial class Level
{
public int LevelId { get; set; }
public string name { get; set; }
public virtual Mater mater { get; set; }
}
当我执行以下查询时,LazyLoading 被禁用,它可以快速运行。
MyGrid mg = new MyGrid();
mg.codes = db.codes.Where(c => c.Maters_MaterId == 1 && c.Levels_LevelId == 1)
.ToList();
这个也是:
MyGrid mg = new MyGrid();
mg.codes = db.codes.Where(c => c.Maters_MaterId == 1 && c.Levels_LevelId == 1)
.Include(c => c.mater)
.ToList();
但是当我执行此查询时,也禁用了 LazyLoading,它会逐步执行,但是当它加载页面(视图)时,它会超时。
MyGrid mg = new MyGrid();
mg.codes = db.codes.Where(c => c.Maters_MaterId == 1 && c.Levels_LevelId == 1)
.Include(c => c.level)
.ToList();
在 Json 脚本中,我也有这个,这有助于清除我之前遇到的一些错误。我添加它以防它有事可做。:
var initialData = @Html.Raw(JsonConvert.SerializeObject(Model, new JsonSerializerSettings{ ReferenceLoopHandling = ReferenceLoopHandling.Ignore} ))
是虚拟的加载方式吗?我可以只加载我需要的字段吗?我在视图上使用Json,它的读取方式可以吗?
【问题讨论】:
-
请在标签中指定编程语言
-
你为什么要禁用延迟加载?
-
您能否在单步执行最后一个代码 sn-p 后验证是否填充了
mg.codes[0].level?您能否使用 SQL Server Profiler 查看在呈现视图时是否进行了其他数据库调用?是否有可能是视图代码本身有一个无限循环,或者当有levels 存在时,它会使其运行缓慢? -
不要启用延迟加载。如果它正在通过这段代码,那么我会超时。
ToList()枚举查询,所以它完成了。我通常会在Where之前添加Include.. 你可以试试,但我不确定这是你的问题 -
如果我不禁用 LazyLoading 它甚至永远不会到达视图。代码非常大,并且有许多来回的关系。视图似乎在召唤他们。
标签: c# json asp.net-mvc lazy-loading iqueryable