2009-09-16 9 views
5

Estoy usando L2S para acceder a mi servidor MSSQL 2008 Express. Me gustaría saber cuándo el DataContext abrirá una conexión a la base de datos? y cerrará la conexión justo después de que la abrió?¿Cuándo abre DataContext una conexión con el DB?

Por ejemplo:

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

No es un L2S pro, pero espero * solo abrir y cerrar en SubmitChanges(). – mxmissile

Respuesta

2

Se establece una conexión cuando realmente empiezas a enumerar y cuando presionas SubmitChanges (si hay cambios que realizar). No estoy seguro de si en el código anterior solo se abre y utiliza UNA conexión, pero sé que en esos dos lugares que mencioné invocará una conexión.

Necesita comenzar a buscar en LinqPad y how to use it en dimecasts. También puedes ver su serie en la Delayed Execution features of Linq 2 Sql

Nota, algo como esto (getTenSomethingElse (s, s, s)) no consulta la base de datos, al menos no hasta que empiece a enumerar el valor de retorno

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 sobre usted, pero considero que es bastante increíble teniendo en cuenta todo el trabajo que se está haciendo.

Ah por cierto, más información sobre eso "Donde (s, s)" extensión se puede encontrar en ScottGu's awesome blog

+0

Ha planteado un muy buen punto con respecto a la función 'System.Linq.IQueryable'. Gracias, eso ayudó. –

0

no sabe acerca de LINQ a SQL internos, pero el sentido común dice que las conexiones de base de datos se deben abrir la menor cantidad de tiempo posible, por lo que es razonable esperar que se abre SubmitChanges la conexión, hace su trabajo, y luego cierra la conexión.

Tenga en cuenta que puede tener acceso al objeto DbConnection utilizado por DataContext. Tal vez si abre la conexión a mano, el DataContext no se cerrará después de que finalice SubmitChanges (simplemente adivinando, nunca lo intenté).

2

LINQ a SQL es bueno para usted: se abrirá y cerrará la conexión de base de datos en SubmitChanges().

Además, si inserta más de un registro, las inserciones estarán contenidas en una sola transacción, por lo tanto, todas tienen éxito o todas fallan.

En el caso de foreach(var obj in dc.SomeTable.AsEnumerable()), se abre y se cierra una conexión de base de datos, solo una vez, durante la cual se recuperan todos los registros.

Cuestiones relacionadas