linq-to-sql如何为集合伪查询生成sql?

时间:2009-08-27 18:54:17

标签: linq-to-sql

我的理解是LinqToSql伪语言使用与SQL非常类似的语法描述了一个集合,这将允许您有效地更新对象集合的属性:

from b in BugsCollection where b.status = 'closed' set b.status = 'open' 

这将仅使用一个SQL语句更新底层数据库。

通常,ORM需要将所有行作为单独的对象进行修改,更新每个行的属性并将它们单独保存到数据库中(至少这是我的理解)。

那么,当其他的orms无法避免时,linq-to-sql如何避免这样做呢?

2 个答案:

答案 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

...已授予,该示例不会更新任何内容......但是对于更新查询而言,该过程将与简单选择相同。