我想将这个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