2013-11-02 32 views
0

我們有一個LINQ從這樣的DB上下文菜單中選擇:獲取從LINQ IEnumerable的選擇

public Category GetCategory(int categoryId) 
{ 
    Category result = null; 
    using (var db = new MyContext()) 
    { 
     result = (from entry in db.Categories 
        where entry.CategoryId == categoryId 
        select entry).FirstOrDefault(); 
    } 
    return result; 
} 

我們擔心這會從時間到時間工作,因爲該函數返回IQueryable和垃圾收集器會殺掉dbUsing結束於此功能)。

我們如何保持Using在這個函數中,並返回選中的對象,但是從db斷開?

+0

究竟什麼是您發佈的代碼問題之前加載導航屬性/集合? –

+1

某些方法將執行的IQueryable,如ToList或FirstOrDefault(如你的例子),一旦發生這種情況,對象存儲在內存中,你可以安全地處理上下文。這種方法似乎是正確的 –

+0

將鼠標懸停在FirstOrDefault()上,我仍然看到對象是IQueryable。 VS 2012錯了嗎? –

回答

3

什麼函數返回IQueryable<T>?您的代碼不返回IQueryable<T>,它返回空值或Category的實例 - .FirstOrDefault()調用的結果。處置DbContext後,Category的實例將正常工作。

也許你的問題涉及導航屬性的延遲加載?那會在using區塊外面炸彈。你應該禁用延遲加載和/或代理生成避免這種或明確退出using

+0

我猜VS讓我困惑,因爲徘徊在頂部顯示IQueryable。謝謝! –