【问题标题】:EFCore load childs entity without load the parent dataEF Core 加载子实体而不加载父数据
【发布时间】:2021-07-06 21:06:40
【问题描述】:

我有下一期。

public class Segment : EntityWithIntId
{
    public string Name { get; set; }

    public int SubCampaignId { get; set; }
    public List<Template> Templates { get; set; }

    [ForeignKey("SubCampaignId")]
    public SubCampaign SubCampaign { get; set; }
}

模板模型。

public class Template : Entity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Status { get; set; }
    public int Order { get; set; }
    public int SegmentId { get; set; }
    public List<Group> Groups { get; set; }

    [ForeignKey("SegmentId")]
    public Segment Segment { get; set; }
}

这是我的查询。

_dbcontext.segments.Include(x => x.templates).ToList();

我想加载所有具有段实体的模板实体。

问题是,当加载模板时,在每个模板中,段关系被重新加载,段再次重新加载所有子模板,这样就创建了循环引用

对不起,我不知道如何表达自己。

我有以下关系。

segment 有一个模板列表

每个模板都有一个组列表 enter image description here 每个组都有一个服务列表。

想法是咨询细分市场,他给我带来所有模板,每个模板带来组,每个组带来服务。

问题在于,由于每个实体都与父实体有关系,系统会自动重新加载父实体的数据。

enter image description here

【问题讨论】:

  • 我有以下关系。段有一个模板列表每个模板都有一个组列表每个组都有一个服务列表。想法是咨询部门,他给我带来所有模板,每个模板带来组,每个组带来服务。问题是每个实体都与父实体有关系,系统会自动重新加载父实体的数据。

标签: c# .net entity-framework .net-core entity-framework-core


【解决方案1】:

使用SelectMany 进行此类查询:

var query = 
   from s in _dbcontext.segments
   from t in s.templates
   from g in t.Groups
   from svc in g.Services
   select svc;

【讨论】:

    【解决方案2】:

    尝试从 Template 类开始,然后使用来自 Entity Framework Core 的 ThenInclude,如下所示:

    _dbcontext.templates.Include(x => x.Segment).ThenInclude(x => x.Templates).ToList();
    

    我认为它应该做你想做的。

    【讨论】:

      【解决方案3】:

      默认,关系对象存储为IQueryable 对象。如果您之前没有接触过它们或使用过Include,它们会更加紧张。 当您从父节点中选择子节点时,父节点的数据会显示在子节点中,因为它之前已加载(参考)。

      试试这个看看更多:

      List<Templates> templates;
      (using dbcontext = new YourContent())
        templates = dbcontext.segments.SelectMany(x => x.templates).ToList();
      

      父节点Segmenttemplates中没有值。

      【讨论】:

        猜你喜欢
        • 2023-02-04
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2016-08-01
        • 2020-05-31
        相关资源
        最近更新 更多