2016-07-26 41 views
2

比方說,我有這樣一個方法,以便:dbSet.Include在調用dbSet之後調用時是無意義的嗎?

public DbSet<Ingredient> GetIngredients(int limit = 0) 
     { 
      return db.Ingredients; 
     } 

所以,在我的控制,我可以作出這樣一個電話:

var ingredients = GetIngredients() 
.Include(i => i.AspNetUser) 
.Include(i => i.AspNetUser1) 
.Include(i => i.Ingredient_Category) 
.Include(i => i.Measurement_Unit); 

這將是毫無意義或慢,因爲GetIngredients()呼叫無論如何要加載一切?

如果是這樣,有沒有辦法讓我可以得到GetIngredients()使用各種包括作爲params?

最糟糕的情況我可以在存儲庫中爲每個場景加載不同的方法(或者我是否應該這樣做呢?感覺控制器應該說什麼視圖要麼...或者DbSet是唯一的以EF,我只能從我的倉庫返回IEnumarables?)

非常感謝

+1

你需要澄清你的問題,你使用包括,如果你是1.不做延遲加載,2.做延遲加載,但你寧願要求在一個查詢中的一切。現在,如果你包含多個包含多對多關係的內容,你可能會想要單獨加載這些內容以避免cartesian生產。你的問題仍然不清楚,你是否想要單獨包括,因爲你想對所包含的內容應用過濾? –

回答

1

難道是毫無意義的或慢,因爲GetIngredients()調用 不管怎樣都是加載的一切嗎?

不,你的查詢不走,直到你諮詢一下要執行(例如,通過的foreach)或致電ToListToArray extenstion方法

有沒有一種方法可以讓我得到GetIngredients()來使用各種包括 params?

public IQueryable<Ingredient> GetIngredients(List<Expression<Func<TEntity, object>>> includes = null) 
{ 
    IQueryable<TEntity> query = db.Ingredients; 

    if (includes != null) 
    { 
     query = includes.Aggregate(query, (current, include) => current.Include(include)); 
    } 
    return query; 
} 

關於你的最後一個顧慮,你應該將DbContext佈置之前從獲取你的數據庫中的數據。因此,如果您從您的控制器調用此方法將結果作爲參數傳遞給您的視圖,請將返回類型更改爲IEnumerable<Ingredient>,並在方法query.ToList();的末尾調用ToList,以確保在通過之前執行查詢導致你的看法。

+0

「不,你的查詢不會被執行,直到你查詢它(例如,通過foreach)或調用ToList或ToArray擴展方法」正是我需要知道的! – rory

相關問題