2010-09-15 35 views
8

我一直在編寫'使用'塊,但我想知道如果我可以返回一個IQueryable從以下沒有對象被處置之前我訪問它。當dbContext帶有'using'塊時,如何從Linq返回一個IQueryable到SQL查詢?

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 

     return contacts; 
    } 
} 

難道我簡單地去掉「使用」塊,讓淨管理的對象,或者我可以得到LINQ到早期運行查詢並返回填充對象。

+0

請注意,顯式處理datacontext並不是必須的。無論如何,這是個好問題。 – fearofawhackplanet 2010-09-15 10:59:44

+0

@fearofawhackplanet - 呃,是的。任何一次性物品都應被假定爲**要求**處置,並且應該適當處理IMO。它可以保持一個開放的連接,例如... – 2010-09-15 11:12:31

+0

@Marc:我只是繼續我在幾個博客上閱讀的內容,還有幾乎所有ScottGu和Linq團隊的例子。據我所知,官方微軟的立場是,如果它讓你感覺更好,你可以處置,但它確實不是必需的。請參閱http://leedumond.com/blog/about-disposing-the-datacontext/,以此作爲關於此問題中描述的處置和防禦執行問題的一些討論的示例。 – fearofawhackplanet 2010-09-15 11:38:09

回答

6

如果您不希望進一步構成數據(在DB服務器),然後:

return contacts.ToList().AsQueryable(); 

雖然在這種情況下,我寧願回到IEnumerable<Contact>IList<Contact>使非組合性很明顯。使用AsQueryable的方法,它仍然是可組合的,但它將通過LINQ到對象組成(所以之後它已經從數據庫獲取記錄)。

如果期望進一步構成它,那麼就應該通過數據上下文(或者,如果可能的話,上游IQueryable<something>的方法中,並讓主叫處理壽命:

public IQueryable<Contact> GetContacts(dbDataContext db, string clientID) 
{ 
    return from _contacts in db.Contacts 
      where _contacts.ClientID == clientID 
      orderby _contacts.LastName ascending 
      select _contacts; 
} 
+0

@IckleMonkey - 這是最重要的*具體*類型,但是'IList '的一個明顯的優勢是它會暴露'.Count'等(和一個索引器),使訪問更加方便。但無論「IList 」與「IEnumerable 」是否相同,它仍然是*列表,因此內存使用是獨立的。或者爲了更簡潔的回答:使用'IList ' – 2010-09-15 11:20:03

-1

你可以做這樣的事情

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    IQueryable contacts; 
    using (dbDataContext db = new dbDataContext()) 
    { 
     contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 


    } 

    return contacts; 
} 
+2

這不會有幫助 - 延遲執行LINQ查詢意味着db-context在底層查詢上調用GetEnumerator()之前仍然很久以前。所以沒有工人。 – 2010-09-15 10:57:59

0

可以使上下文對象類的成員實例?如果可以的話,您將推遲調用以運行查詢,直到您實際觸及您要返回的IQueryable實例的枚舉器。這取決於你想要做什麼。你需要從這個方法返回IQueryable,還是你可以做IEnumerable?

+0

我想我會去IEnumerable,如果我使用成員實例方法,那麼如果我的類用作'使用'塊,我可能會遇到同樣的問題,並且我想訪問此外返回的數據。感謝您的建議。 – polom1nt 2010-09-15 11:22:29

0

IQueryable結果集中的聯繫對象實例將保留在using塊中使用的datacontext的引用,並且將在預期的客戶端代碼中工作。您將能夠對生成的IQueryable實例執行延遲SQL操作,並通常執行其他IQueryable操作。

+1

當我嘗試時,我得到'Dispose後訪問的DataContext'。 – polom1nt 2010-09-15 11:16:59