2009-08-27 67 views
0

我的理解是,LinqToSql pseudolanguage描述了一组使用非常类似于SQL语法,这将让你有效地对对象的集合更新属性:linq-to-sql如何为集合pseudoqueries生成sql?

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

这将更新只用基础数据库一个SQL语句。

正常情况下,ORM需要retieve所有的行作为单独的对象,更新他们每个人的属性,并单独保存到数据库中(至少这是我的理解)。

那么,如何为做到这一点的LINQ到SQL避免在其他的ORM无法避免呢?

回答

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 

。 ..granted,该示例不会更新任何内容......但该过程对于更新查询是相同的而不是简单的选择。

2

问题中显示的语法不正确。 LINQ不打算有副作用;它是一种查询语言。正确的方法来完成你正在寻找的是

var x = from b in dataContext.BugsCollection where b.status == "closed"; 
foreach (var y in x) 
y.status = "open"; 

dataContext.SubmitChanges(); 

这将生成您正在谈论的单个SQL语句。它能够完成这个任务的原因是因为延迟执行--L2S引擎实际上并没有与数据库交谈,在这种情况下,因为调用了SubmitChanges()。然后,L2S将生成的SQL语句发送到数据库以供执行。

+0

y.status =“open”; – 2009-08-28 12:26:34

+0

固定。谢谢迈克! – 2009-08-28 14:58:07