我的理解是LinqToSql伪语言使用与SQL非常类似的语法描述了一个集合,这将允许您有效地更新对象集合的属性:
from b in BugsCollection where b.status = 'closed' set b.status = 'open'
这将仅使用一个SQL语句更新底层数据库。
通常,ORM需要将所有行作为单独的对象进行修改,更新每个行的属性并将它们单独保存到数据库中(至少这是我的理解)。
那么,当其他的orms无法避免时,linq-to-sql如何避免这样做呢?
答案 0 :(得分:2)
您的问题中显示的语法不正确。 LINQ不具有副作用;它是一种查询语言。完成你正在寻找的东西的正确方法是
var x = from b in dataContext.BugsCollection where b.status == "closed";
foreach (var y in x)
y.status = "open";
dataContext.SubmitChanges();
这将生成您正在讨论的单个SQL语句。它能够实现这一点的原因是因为延迟执行 - 在这种情况下,由于调用SubmitChanges(),L2S引擎实际上并不与数据库通信。然后,L2S将生成的SQL语句发送到数据库以供执行。
答案 1 :(得分:1)
因为LINQ to SQL使用Expression Trees将查询语法转换为实际的SQL ...然后它针对数据库执行SQL(而不是拉动所有数据,针对内存数据执行,以及然后将更改写回数据库)。
例如,以下查询语法:
var records = from r in Records
where r.Property == value
select r
首先转换为Lamda语法:
Records.Where(r => r.Property == value).Select();
最后到SQL(通过Expression Trees):
SELECT Property, Property2, Property3 FROM Record WHERE Property = @value
...已授予,该示例不会更新任何内容......但是对于更新查询而言,该过程将与简单选择相同。