2013-11-02 82 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。谢谢! –