G'day大家.
我还在学习LINQ,如果这是天真的话请原谅我.当您直接处理SQL时,可以使用条件生成更新命令,而无需运行select语句.
当我使用linq时,我似乎遵循以下模式:
我想要做的是使用linq和延迟执行直接更新.是否可能直接在SQL上执行实际执行而没有任何数据传输到客户端?
DataContext dc = new DataContext
var q = from product in dc.Products
where product.Type = 1
set product.Count = 0
dc.SubmitChanges
Run Code Online (Sandbox Code Playgroud)
因此,实质上LINQ具有所需的所有信息,而无需使用select来生成更新命令.它将运行SQL:
Update Products Set Count = 0 Where Type = 1
Run Code Online (Sandbox Code Playgroud)
LINQ中是否存在类似"set"的关键字?
lak*_*tak 45
实际上,您可以让LINQ-to-SQL生成更新语句:
Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
在您的Dbml中,为所有属性设置UpdateCheck ="Never".
这将生成单个更新语句,而不必先进行选择.
需要注意的是:如果您希望能够将Name设置为null,则必须将foo对象初始化为不同的值,以便Linq可以检测到更改:
Foo foo=new Foo { FooId=fooId, Name="###" };
...
foo.Name=null;
Run Code Online (Sandbox Code Playgroud)
如果您想在更新时检查时间戳,也可以这样做:
Foo foo=new Foo { FooId=fooId, Modified=... };
// Modified needs to be set to UpdateCheck="Always" in the dbml
Run Code Online (Sandbox Code Playgroud)
Ran*_*pho 30
不,LINQ和LINQ to SQL都没有基于集合的更新功能.
在LINQ to SQL中,您必须查询要更新的对象,根据需要更新字段/属性,然后调用SubmitChanges().例如:
var qry = from product in dc.Products where Product.Name=='Foobar' select product;
var item = qry.Single();
item.Count = 0;
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
如果您想进行批处理:
var qry = from product in dc.Products where Product.Type==1 select product;
foreach(var item in qry)
{
item.Count = 0;
}
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
或者,您可以自己编写查询:
dc.ExecuteCommand("update Product set Count=0 where Type=1", null);
Run Code Online (Sandbox Code Playgroud)