我想將這個t-sql轉換爲linq到sql。如何將更新/連接SQL轉換爲Linq To SQL?
UPDATE Table1
SET CustomerName = 'john Doe'
FROM Table1
JOIN Table2
ON Table1.TableID = Table2.TableID
WHERE CustomerID = 4
我想將這個t-sql轉換爲linq到sql。如何將更新/連接SQL轉換爲Linq To SQL?
UPDATE Table1
SET CustomerName = 'john Doe'
FROM Table1
JOIN Table2
ON Table1.TableID = Table2.TableID
WHERE CustomerID = 4
不幸的是,Linq to SQL沒有「update」語句。使用擴展方法IQueryable
,表達式樹和DbCommand
s可能(但有點複雜)。一種方法是here - 您可以在最後下載一些源代碼。
請記住,這可能是更復雜的查詢錯誤。當我使用Linq到SQL時,我通常會通過存儲過程執行所有批量更新/刪除操作。
或者,如果您只是希望使更新代碼更易於編寫而不關心性能(即因爲您知道將有非常少量的行進行更新),所以實現了一個Update Operator (擴展方法),您可能可以使用。
ExecuteCommand適用於LINQ to SQL功能不夠強大的少數(希望)場合。
如果我正確理解你的SQL查詢,你想用CustomerId = 4
更新客戶的名字。
由於您不能直接發佈此SQL(如其他人已經指出的那樣),您需要從db中使用id 4獲取客戶(使用DataContext
),更改他的名稱並將更改提交到數據庫使用DataContext.SubmitChanges().
這是一個簡單的方法來做到這一點使用LINQ到SQL:
var query = from x in db.Table1
join y in db.Table2 on x.TableID equals y.TableID
where x.CustomerID == 4
select x;
foreach(var result in query) {
result.CustomerName = "John Doe";
}
db.SubmitChanges();
這個方法是好的,如果你確定了結果集將我小,但它的大慘敗執行結果集。有使用LINQ到SQL的batch updates的方法,或者您可以使用DataContext.ExecuteCommand
。
@Aaron:我認爲需要注意的是你指出的'Update'擴展方法是一個LINQ-to-Objects擴展方法;也就是說,它會在內存中執行更新,並且仍然需要調用「DataContext.SubmitChanges」。 – jason 2009-12-27 19:03:47
@Jason:是的,它只是取代了'foreach'循環。附:感謝您重新發布我的批量更新鏈接。 ;-) – Aaronaught 2009-12-27 19:31:02