C# 在LINQ中通过一次数据库更新?
当LINQ访问数据库时,以及它如何知道最佳时间是什么时候,我都很难受。主要来说,这个UPDATE语句似乎对数据库进行了两次访问。但它不应该——在LINQ中,除了查询行、更新行,然后保存更改之外,似乎没有“更新”等价物。在基本SQL中,我应该能够一下子更新WHEREC# 在LINQ中通过一次数据库更新?,c#,sql,linq,ado.net,sql-update,C#,Sql,Linq,Ado.net,Sql Update,当LINQ访问数据库时,以及它如何知道最佳时间是什么时候,我都很难受。主要来说,这个UPDATE语句似乎对数据库进行了两次访问。但它不应该——在LINQ中,除了查询行、更新行,然后保存更改之外,似乎没有“更新”等价物。在基本SQL中,我应该能够一下子更新WHERE var query = from u in db.users where u.id == 1 select u; foreach (user u in query) { u.name = "JOE"; } db.Save();
var query = from u in db.users where u.id == 1 select u;
foreach (user u in query)
{
u.name = "JOE";
}
db.Save();
我有扑救的魔力。它允许我在提交之前进行多次更改。但似乎仍然存在对行的初始查询
想法?想法
编辑
现在经过测试,我可以确认它确实进入数据库两次。一定有更好的办法 如果
id
是主键,则可以使用:
var u = new user { id = 1 };
db.users.Attach(u);
u.name = "JOE";
db.SubmitChanges();
看看一个定制的Linq扩展,比如这个。这里有
DeleteBatch
和UpdateBatch
方法。特别是,UpdateBatch
接受条件和更新表达式,并作为一个SQL查询执行。Attach不会访问数据库以确定要附加哪一行?不,不需要。它知道您指的是id为1
的user
。您(显然)无法从对象中读取任何其他属性,因为它们尚未从数据库中获取。但是您所做的任何更改都将通过UPDATE
命令应用。这太棒了。是否有一个可以通过断点检查的本地查询,以查看SQL查询的实际内容?如果创建一个时间戳列并设置user{id=1,timetamp=savedTimestamp,}代码>您也将获得脱机并发检查。@CarlBenson,您可以键入myDbContext.Log=Console.Out
将每个linq2sql生成的SQL查询打印到Visual Studio中的输出窗口。