我在EF中使用代碼優先。比方說,我有兩個實體:在EF代碼優先過濾導航屬性
public class Farm
{
....
public virtual ICollection<Fruit> Fruits {get; set;}
}
public class Fruit
{
...
}
我的DbContext是這樣的:
public class MyDbContext : DbSet
{
....
private DbSet<Farm> FarmSet{get; set;}
public IQueryable<Farm> Farms
{
get
{
return (from farm in FarmSet where farm.owner == myowner select farm);
}
}
}
我這樣做,這樣每個用戶只能看到他的農場,和我沒有打電話給在每個查詢到db的地方。現在
,我想所有的水果從一個農場進行篩選,我想這(在農場類):
from fruit in Fruits where fruit .... select fruit
,但生成的查詢不包括where子句,這是因爲很重要我有成千上萬的行,並且效率不高,無法將它們全部加載,並在它們是對象時進行過濾。
,我讀了延遲加載性能得到填補他們正在訪問的第一次,但他們閱讀所有的數據,沒有過濾器可以,除非你做這樣的事情可應用於:
from fruits in db.Fruits where fruit .... select fruit
但我不能這樣做,因爲農場沒有DbContext的知識(我不認爲它應該(?)),但對我來說,它只是失去了使用導航屬性的全部目的,如果我必須處理所有的數據而不只是一個屬於我的農場。
所以,
- 我在做什麼錯事/作出錯誤的假設?
- 有沒有什麼辦法可以將過濾器應用於導航屬性,並將其生成爲真正的查詢? (我正在處理大量數據)
謝謝您的閱讀!
謝謝Jeremy,我決定遵循你的建議,並在我的上下文類中留下過濾/處理責任。這是有道理的,因爲我只需要爲我的某個實體進行過濾,但如果我需要爲多個實體使用它,這會很麻煩,您不覺得嗎?上下文將填充查詢和填充實體的方法。我不認爲這打破了單一責任原則,但這聽起來很奇怪,不是嗎? – edpaez