繁体   English   中英

实体框架-InverseProperty和IQueryable(或等效项)

[英]Entity Framework - InverseProperty and IQueryable (or Equivalent)

我对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).

显然,这可以工作...但是,向前迈进,我想知道是否有更好的解决方案?

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

这将首先加载整个Comments集合,然后进行过滤,对不对?

是。

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

从理论上讲,通过将存储库甚至上下文注入到实体构造函数中。 但是您将在数据访问层上依赖POCO实体。 我不想要这种解决方案。

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

itemRepository.LoadActiveComments(item);

像这样实现:

void LoadActiveComments(Item item)
{
    context.Entry(item).Collection(i => i.Comments).Query()
        .Where(c => c.IsActive).Load();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM