我正在使用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?
答案 0 :(得分:3)
当您实际开始枚举时以及当您点击SubmitChanges时(如果要进行更改),将建立连接。我不确定在上面的代码中是否只打开和使用了一个连接,但我知道在我提到的这两个地方,你会调用一个连接。
您需要开始在LinqPad处查看how 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关于你,但我认为考虑到所有正在进行的工作,这是相当棒的。
哦,顺便说一句,有关“Where(s,s)”扩展名的更多信息可以在ScottGu's awesome blog上找到
答案 1 :(得分:2)
LINQ to SQL对您有好处:它将在SubmitChanges()中打开和关闭数据库连接。
此外,如果您插入多条记录,插入内容将包含在单个事务中,因此它们都会成功或者都会失败。
在foreach(var obj in dc.SomeTable.AsEnumerable())
的情况下,打开和关闭数据库连接 - 只需一次,在此期间检索所有记录。
答案 2 :(得分:0)
不了解LINQ to SQL内部,但常识告诉必须以尽可能少的时间打开数据库连接,因此可以合理地期望SubmitChanges打开连接,它的工作原理,然后关闭连接。
请注意,您可以访问DataContext使用的DbConnection对象。也许如果您手动打开连接,DataContext将不会在SubmitChanges完成后关闭它(只是猜测,从未尝试过)。