Linq to sql DataContext何时打开到DB的连接?

Linq to sql DataContext何时打开到DB的连接?,linq-to-sql,sql-server-2008,.net-3.5,Linq To Sql,Sql Server 2008,.net 3.5,我正在使用L2S访问我的MSSQL 2008 Express服务器。我想知道DataContext何时会打开到DB的连接?它会在打开后立即关闭连接吗 例如: var dc = new TestDB(); // connection opened and closed? dc.SomeTable.InsertOnSubmit(obj); // connection opened and closed? foreach(var obj in dc.SomeTable.AsEnumerable

我正在使用L2S访问我的MSSQL 2008 Express服务器。我想知道DataContext何时会打开到DB的连接?它会在打开后立即关闭连接吗

例如:

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?

不知道LINQ到SQL的内部结构,但常识告诉我们,数据库连接必须在尽可能短的时间内打开,因此有理由期望SubmitChanges打开连接,执行其工作,然后关闭连接


请注意,您可以访问DataContext使用的DbConnection对象。如果手动打开连接,则在SubmitChanges完成后,DataContext可能不会关闭连接(只是猜测,从未尝试过)。

当您实际开始枚举并点击SubmitChanges(如果要进行更改)时,会建立连接。我不确定在上面的代码中是否只打开和使用了一个连接,但我知道在我提到的两个地方,您将调用一个连接

你需要开始仔细研究一下。也可以在网上查看他们的系列节目

注意,类似这样的东西(gettensmethingelse(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);
    }
}
部分类MyDataContext
{
//构建树以从与Criteria匹配的db中提取数据,并将其传递给另一个类的ctor
public System.Linq.IQueryable getSomethingElse(字符串searchTerm、字符串searchValue、字符串orderBy)
{
可变项目=
从s开始
这是什么
选择新的某物;
返回项目.Where(searchTerm,searchValue).OrderBy(OrderBy);
}
//调用上述方法,但将take 10添加到该树
public System.Linq.IQueryable GettensMethingElse(字符串searchTerm、字符串searchValue、字符串orderBy)
{
可变项目=
从s开始
this.getSomethingElse(searchTerm、searchValue、orderBy)
选择s;
退货项目。取(10);
}
}
关于你,但我认为这是相当可怕的考虑到所有的工作正在做。
哦,顺便说一句,关于“Where(s,s)”扩展的更多信息可以在

上找到。LINQ to SQL对您很好:它将在SubmitChanges()中打开和关闭数据库连接

此外,如果插入多条记录,则插入将包含在单个事务中,因此要么全部成功,要么全部失败


foreach(dc.SomeTable.AsEnumerable()中的var obj)的情况下,
只打开和关闭一次数据库连接,在此期间检索所有记录。

不是L2S pro,但我希望它只能在SubmitChanges()中打开和关闭.您对
System.Linq.IQueryable
函数提出了一个非常好的观点。谢谢,这很有帮助。