【问题标题】:When does the DataContext will open a connection to the DB?DataContext 何时会打开与数据库的连接?
【发布时间】:2010-11-28 20:59:46
【问题描述】:

我正在使用 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?

【问题讨论】:

  • 不是 L2S 专业人士,但我希望它只会在 SubmitChanges() 中打开和关闭。

标签: linq-to-sql sql-server-2008 .net-3.5


【解决方案1】:

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

您需要通过dimecasts 开始查看LinqPadhow to use it。还可以在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,但考虑到正在完成的所有工作,我认为这非常棒。

哦,顺便说一句,关于“Where(s,s)”扩展的更多信息可以在ScottGu's awesome blog上找到

【讨论】:

  • 您就System.Linq.IQueryable 函数提出了一个非常好的观点。谢谢,这有帮助。
【解决方案2】:

LINQ to SQL 对你有好处:它将在 SubmitChanges() 中打开和关闭数据库连接。

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

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

【讨论】:

    【解决方案3】:

    不了解 LINQ to SQL 的内部结构,但常识告诉我们必须尽可能缩短打开数据库连接的时间,因此可以合理地预期 SubmitChanges 打开连接,完成它的工作,然后关闭连接。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多