2009-08-27 68 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