2011-07-14 54 views
6

后丢弃我有一些短代码,看起来像这样:IQueryable的使用

public static IQueryable<User> SelectFromEmployee(int employee) 
{ 
    using (var ctx = Database.AccountingContext()) 
    { 
     return ctx.Users.Where(c => c.Employee_FK == employee); 
    } 
} 

,如果我只是保持这个代码,因为它是和使用结果我得到的连接异常,告诉我说,数据配置。但如果我这样做:

public static IEnumerable<User> SelectFromEmployee(int employee) 
{ 
    using (var ctx = Database.AccountingContext()) 
    { 
     return ctx.Users.Where(c => c.Employee_FK == employee).ToList(); 
    } 
} 

一切工作正常。但我的问题是,我想要使用需要IQueryable的Linq Dynamic。有什么方法可以返回本地IQueryable,所以我可以继续使用它?

+0

在第二代码片段使用的是'ToList()'这将创建一个新的列表'ctx'等没有问题,如果你_dispose_之后的'ctx',但在你的第一次尝试你处置'ctx'并在'using'范围之外使用它的值。 –

回答

1

如果你想从字面上做你问

public static IQueryable<User> SelectFromEmployee(int employee) 
{ 
    using (var ctx = Database.AccountingContext()) 
    { 
     return ctx.Users.Where(c => c.Employee_FK == employee).ToList().AsQueryable(); 
    } 
} 

要小心,虽然你返回的是不再与数据上下文相关联什么,所以关系导航例如,将无法正常工作,你可能期望如果数据上下文尚未处理。

4

的问题是,你正在创建数据上下文,然后处置它:

using (var ctx = Database.AccountingContext())

只是为了让你去,试试这个来代替:

ObjectContext context = Database.AccountingContext(); 
public static IQueryable<User> SelectFromEmployee(int employee) 
{ 
    return context.Users.Where(c => c.Employee_FK == employee); 
} 

我在这里所做的我将Data Context挪到了方法的外部,现在的问题是您需要自己控制它的处理,并且您可能还需要考虑阻止了更多的连接,因此请务必处理连接。

编辑

我假设你希望能够利用关系等为好。

1

问题是你正在处理DataContext。一种选择是在使用查询结果时保留它。

4

您需要选择:

  1. 不处置的情况下(不使用using语句),并获得IQueryable<User>,这是对数据库的依赖。
  2. 处置上下文并得到IQueryable<User>ToList().AsQueryable(),这是依赖于内存。

请注意,重要的一点是数据是通过延迟加载的地方。