簡體   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