2011-07-14 51 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(),這是依賴於內存。

請注意,重要的一點是數據是通過延遲加載的地方。