即使禁用了LazyLoading,也可以在IQueryable中使用Include()

时间:2015-07-23 19:38:40

标签: c# json asp.net-mvc lazy-loading iqueryable

我有一个父母'链接到其他实体的实体,在加载列表时,由于所有连接而超时,因此我禁用了LazyLoading。

它一直运行良好,但现在我需要从子实体中检索字段。因此,我使用.Include()将实体包含在查询中,并且加载时间太长。

这些是实体。编码就像是从其他类创建的树关系的摘要。

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,它是如何读取的?

1 个答案:

答案 0 :(得分:0)

听起来您需要在视图中使用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();