【发布时间】:2020-05-23 20:22:00
【问题描述】:
我有以下对象,称为过滤器,具有以下属性:
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Type> Types{ get; set; }
public virtual ICollection<Step> Steps { get; set; }
public virtual ICollection<Flow> Flows { get; set; }
public virtual ICollection<Room> Rooms { get; set; }
当我从数据库中选择过滤器列表时,我不知道如何包含集合(类型、步骤、流程、房间)。我的代码如下:
var filters = (
from filter in dbContext.DbSet<Filter>()
let rooms = (
from r in dbContext.DbSet<Room>()
select r
)
let eventTypes = (
from t in dbContext.DbSet<Type>()
select t
)
let processFlows = (
from f in dbContext.DbSet<Flow>()
select f
)
let processFlowSteps = (
from s in dbContext.DbSet<Step>()
select s
)
select filter
).ToList();
我的Filter集合被返回了,但是里面的集合是空的。您能告诉我如何实现这一目标吗?
Ps:由于性能问题,我不想使用 Include,我不喜欢 Entity Framework 生成查询的方式,我想这样做。
【问题讨论】:
-
为什么不用
dbContext.Filters而不是dbContext.DbSet<Filter>()? -
@juharr 这实际上是同一件事,所以没关系。
-
" 我不喜欢 Entity Framework 生成查询的方式,我想这样做" “这种方式”是什么意思?如果您的意思是显示的代码,显然它不起作用,因此绝对不能成为“方式”。即使您在
select中包含let变量(例如select new { filter, rooms, etc.... }),生成的查询也会比Include的查询差得多,因为let查询将针对@987654330 的每条记录执行@ 桌子。结果集将是完整的笛卡尔积。对我来说听起来像是 XY 问题。 -
只是一个一个地加载每个导航,我不知道你为什么需要让。您可以只实现过滤器,然后对每个集合执行相同操作,但这次您不需要存储结果。应该填充过滤器。
-
通过延迟加载,您不需要被包含。
标签: c# entity-framework linq lambda