c# – 实体框架 – InverseProperty和IQueryable(或等效)

我仍然是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();
}
点赞