Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ中通过一次数据库更新?_C#_Sql_Linq_Ado.net_Sql Update - Fatal编程技术网

C# 在LINQ中通过一次数据库更新?

C# 在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();

当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();
我有扑救的魔力。它允许我在提交之前进行多次更改。但似乎仍然存在对行的初始查询

想法?想法

编辑


现在经过测试,我可以确认它确实进入数据库两次。一定有更好的办法

如果
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中的输出窗口。