【问题标题】:Using Include() in IQueryable times out even with LazyLoading disabled即使禁用 LazyLoading,在 IQueryable 中使用 Include() 也会超时
【发布时间】: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


【解决方案1】:

听起来您需要在视图中添加mater,因为当您包含该部分时它会起作用。

尝试同时包含两者

MyGrid mg = new MyGrid();
mg.codes = db.codes
    .Include(c => c.mater)
    .Include(c => c.level)
    .Where(c => c.Maters_MaterId == 1 && c.Levels_LevelId == 1)
    .ToList();

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2012-02-02
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多