4

我对 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 上做一个 where:

var comments = itemCommentRepository.QueryAll()
    .Where(x => x.IsActive && x.ItemId == XX).

这显然会奏效......但我想知道是否有更好的解决方案?

更新:似乎整个结果集都已加载,并且任何过滤都将在整个数据集客户端完成。除了 hack 或更改实体以传递上下文(糟糕!)之外,似乎没有内置的方法可以这样做。已将@Slauma 的回复标记为答案。

4

1 回答 1

2

这将首先加载整个评论集合,然后过滤对吗?

是的。

这可以使用实体的属性来完成吗

理论上,通过将存储库甚至上下文注入实体构造函数。但是您的 POCO 实体将依赖于数据访问层。我不喜欢这个解决方案。

您提出的解决方案是一种方法。您也可以使用显式加载:

itemRepository.LoadActiveComments(item);

像这样实现:

void LoadActiveComments(Item item)
{
    context.Entry(item).Collection(i => i.Comments).Query()
        .Where(c => c.IsActive).Load();
}
于 2012-11-16T16:15:41.543 回答