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
因此,实质上LINQ具有所需的所有信息,而无需使用select来生成更新命令.它将运行SQL:
Update Products Set Count = 0 Where Type = 1
LINQ中是否存在类似"set"的关键字?
实际上,您可以让LINQ-to-SQL生成更新语句:
Foo foo=new Foo { FooId=fooId }; // create obj and set keys context.Foos.Attach(foo); foo.Name="test"; context.SubmitChanges();
在您的Dbml中,为所有属性设置UpdateCheck ="Never".
这将生成单个更新语句,而不必先进行选择.
需要注意的是:如果您希望能够将Name设置为null,则必须将foo对象初始化为不同的值,以便Linq可以检测到更改:
Foo foo=new Foo { FooId=fooId, Name="###" }; ... foo.Name=null;
如果您想在更新时检查时间戳,也可以这样做:
Foo foo=new Foo { FooId=fooId, Modified=... }; // Modified needs to be set to UpdateCheck="Always" in the dbml
不,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();
如果您想进行批处理:
var qry = from product in dc.Products where Product.Type==1 select product; foreach(var item in qry) { item.Count = 0; } dc.SubmitChanges();
或者,您可以自己编写查询:
dc.ExecuteCommand("update Product set Count=0 where Type=1", null);