2009-09-16 57 views
5

我使用L2S訪問我的MSSQL 2008 Express服務器。我想知道DataContext什麼時候會打開到DB的連接?並在打開它後立即關閉連接?DataContext何時會打開到數據庫的連接?

例如:

var dc = new TestDB(); // connection opened and closed? 

dc.SomeTable.InsertOnSubmit(obj); // connection opened and closed? 

foreach(var obj in dc.SomeTable.AsEnumerable()) // connection opened and closed? 
{ 
    ... // connection opened and closed? 
} 

dc.SubmitChanges();  // connection opened and closed? 
+0

不是L2S專業版,但我希望它只能在SubmitChanges()中打開和關閉。 – mxmissile 2009-09-16 16:31:46

回答

2

建立連接,當你打的SubmitChanges(如果有要進行更改)。我不知道,如果在上面的代碼中只有一個連接被打開和使用,但我知道在我提到的兩個地方,你會調用連接。

您需要開始查看LinqPadhow to use it而不是dimecasts。還檢查了他們的一系列關於Delayed Execution features of Linq 2 Sql

注意,這樣的事情(getTenSomethingElse(S,S,S))不查詢數據庫,至少直到你開始列舉了返回值

partial class MyDataContext 
{ 
    // builds the tree to pull data from the db that matches a criteriea and pass it a ctor of another class 
    public System.Linq.IQueryable<SomethingElse> getSomethingElse(string searchTerm, string searchValue, string orderBy) 
    { 
     var items = 
      from s in 
      this.Somethings 
      select new SomethingElse(s); 

     return items.Where(searchTerm, searchValue).OrderBy(orderBy); 
    } 

    // calls the above method but adds take 10 to that tree 
    public System.Linq.IQueryable<SomethingElse> getTenSomethingElse(string searchTerm, string searchValue, string orderBy) 
    { 
     var items = 
      from s in 
      this.getSomethingElse(searchTerm, searchValue, orderBy) 
      select s; 

     return items.Take(10); 
    } 
} 

IDK你,但我認爲這是相當真棒考慮正在完成所有的工作,多數民衆贊成。

哦順便說一句,對「在哪裏(S,S)」擴展的更多信息可以在ScottGu's awesome blog

+0

您提出了一個關於'System.Linq.IQueryable'函數的非常好的觀點。謝謝,這有幫助。 – 2009-11-18 05:36:19

0

不知道LINQ to SQL的內部,但常識告訴數據庫連接必須打開的時間儘可能少,因此可以合理預期的SubmitChanges將打開連接,完成它的工作,然後關閉連接。

注意無論如何,你可以有機會獲得由DataContext的使用的DbConnection對象。也許如果你打開手動連接,在DataContext將不後的SubmitChanges完成關閉它(只是猜測,從來沒有嘗試過)。當你真正開始列舉和

2

LINQ發現SQL是很好的你:它會打開和關閉的SubmitChanges數據庫連接()。

另外,如果您插入多個記錄,插入將包含在單個事務中,因此它們全部成功或者全部失敗。

foreach(var obj in dc.SomeTable.AsEnumerable())的情況下,數據庫連接打開和關閉 - 只有一次,在此期間檢索所有記錄。

相關問題