首页 > 解决方案 > 从 db 检索数据时排除子表数据

问题描述

我正在使用实体框架代码优先方法,下表是我在某些条件下从中检索数据的表格。

public class Case
{
    public int CaseId { get; set; }
    public string Name { get; set; }
    public DateTime StartDateTime { get; set; }
    public DateTime? EndDateTime { get; set; }
    public virtual ICollection<CaseUser> CaseUsers { get; set; }
    public virtual ICollection<Sector> Sectors { get; set; }
    public virtual ICollection<CasePoaSerie> CasePoaSeries { get; set; }
    public virtual ICollection<Pod> Pods { get; set; }
    public virtual ICollection<Poa> Poas { get; set; }

    public Case()
    {
        CaseUsers = new Collection<CaseUser>();
        Sectors = new Collection<Sector>();
        CasePoaSeries = new Collection<CasePoaSerie>();
        Pods = new Collection<Pod>();
        Poas = new Collection<Poa>();
    }
}

存储库功能:

public List<Case> GetActiveCasesForUser(int userId)
    {
        var queryable = DbSet.Include(x => x.CaseUsers);
        queryable = queryable.Where(x => x.CaseUsers.Any(o => o.UserId == userId));
        queryable = queryable.Where(m => m.StartDateTime <= DateTime.Now && (m.EndDateTime == null || m.EndDateTime <= DateTime.Now));

        return queryable.ToList();
    }

问题:

在结果集中,我只想要关于 case 表和 caseusers 表的数据,但结果包含所有相关表的数据,包括不需要的部门、casepoaseries、pods、poas。

有人可以帮助我,以便我的结果集只有主表内容和 caseusers 表的内容,其余表的计数应为 0。

标签: c#entity-frameworklinq

解决方案


实体框架中的延迟加载

延迟加载是延迟加载相关数据,直到您特别请求它。它与急切加载相反。

延迟加载规则:

  1. context.Configuration.ProxyCreationEnabled 应该为真。
  2. context.Configuration.LazyLoadingEnabled 应该为真。
  3. 导航属性应定义为公共的、虚拟的。如果属性未定义为虚拟,则上下文不会进行延迟加载。

实体框架中的急切加载

急切加载是对一种类型的实体的查询同时加载相关实体作为查询的一部分的过程,因此我们不需要为相关实体执行单独的查询。使用 Include() 方法实现急切加载。


推荐阅读