Когда DataContext откроет соединение с БД? - PullRequest
6 голосов
/ 16 сентября 2009

Я использую L2S для доступа к моему серверу MSSQL 2008 Express. Я хотел бы знать, когда 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?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2009

Соединение устанавливается, когда вы фактически начинаете перечисление и когда вы нажимаете SubmitChanges (если есть изменения, которые нужно сделать). Я не уверен, что в приведенном выше коде открыто и используется только ОДНО соединение, но я знаю, что в тех двух местах, которые я упомянул, вы будете вызывать соединение.

Вам нужно начать изучать LinqPad и как его использовать более на dimecasts . Также ознакомьтесь с их сериями по функциям отложенного выполнения 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);
    }
}

ИДК о вас, но я считаю, что это довольно круто, учитывая всю проделанную работу.

О, кстати, больше информации о расширении "Где (s, s)" можно найти в Потрясающий блог ScottGu

2 голосов
/ 21 сентября 2009

LINQ to SQL хорош для вас: он открывает и закрывает соединение с базой данных в SubmitChanges ().

Кроме того, если вы вставите более одной записи, вставки будут содержаться в одной транзакции, поэтому либо все они пройдут успешно, либо все не получится.

В случае foreach(var obj in dc.SomeTable.AsEnumerable()) соединение с базой данных открывается и закрывается - только один раз, во время которого извлекаются все записи.

0 голосов
/ 21 сентября 2009

Не знаю насчет внутренних функций LINQ to SQL, но здравый смысл говорит, что соединения с базой данных должны быть открыты как можно меньше времени, поэтому разумно ожидать, что SubmitChanges открывает соединение, выполняет его, а затем закрывает подключение.

Обратите внимание, что в любом случае вы можете иметь доступ к объекту DbConnection, используемому DataContext. Возможно, если вы откроете соединение вручную, DataContext не закроет его после завершения SubmitChanges (просто угадайте, никогда не пробовал).

...