我仍然是EF(v4.1)的新手,如果我错了,请纠正我,但如果我有一个InverseProperty如下:
public virtual ICollection<ItemComment> Comments { get; set; }
访问该属性时,这将是延迟加载的.但是,如果我希望过滤此列表 – 例如,要仅获取活动注释,我可以添加另一个属性,如下所示:
public IEnumerable<ItemComment> ActiveComments {
get { return Comments.Where(x => x.IsActive); }
}
但是,这将首先加载整个Comments集合,然后过滤对吧?那么不使用IQueryable?为了表现,理想情况下我想使用IQueryable获取列表.
所以我的问题是,这可以使用像这样的实体的属性来完成吗?或者我将不得不直接在ItemComments上进行操作:
var comments = itemCommentRepository.QueryAll()
.Where(x => x.IsActive && x.ItemId == XX).
这显然会有效……但是我想知道是否有更好的解决方案?
更新:似乎整个结果集已加载,任何过滤都将在整个数据集客户端完成.除了hacks,或者更改实体以传递上下文(yuck!)之外,似乎没有内置的方法来执行此操作.已将@ Slauma的回复标记为答案.
最佳答案
this will load the entire Comments collection first, and then filter
right?
是.
can this be done using a property of an entity
理论上,通过将存储库甚至上下文注入实体构造函数.但是,您的POCO实体将依赖于数据访问层.我不喜欢这个解决方案.
您提出的解决方案是一种方式.您也可以使用显式加载:
itemRepository.LoadActiveComments(item);
像这样实现:
void LoadActiveComments(Item item)
{
context.Entry(item).Collection(i => i.Comments).Query()
.Where(c => c.IsActive).Load();
}