c# - 从 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。
解决方案
实体框架中的延迟加载
延迟加载是延迟加载相关数据,直到您特别请求它。它与急切加载相反。
延迟加载规则:
- context.Configuration.ProxyCreationEnabled 应该为真。
- context.Configuration.LazyLoadingEnabled 应该为真。
- 导航属性应定义为公共的、虚拟的。如果属性未定义为虚拟,则上下文不会进行延迟加载。
实体框架中的急切加载
急切加载是对一种类型的实体的查询同时加载相关实体作为查询的一部分的过程,因此我们不需要为相关实体执行单独的查询。使用 Include() 方法实现急切加载。
推荐阅读
- javascript - 尝试隐藏移动导航时,它不会隐藏列表和按钮。为什么?
- php - 简化函数 Laravel
- python - 引用列表而不是副本
- python - 将 scipy 导入 Python 时出现导入错误
- python - ModuleNotFoundError:没有名为“discord”的模块/如何切换 python 版本
- c++ - 如何定义正数的概念?
- javascript - 第一次播放时 Javascript 音频“缓冲/滞后”?
- python - 优化函数以在 pandas 的 4 个标准差内找到滚动窗口中的最大值和最小值
- npm - NPM、bootsrap5(和 Wagtail?)的模板问题
- javascript - 在node.js mongodb中查询未定义的数据