CodeGo.net>如何在LINQ的SQL插入或更新有一个where子句?
作者:互联网
我正在尝试将以下存储的proc转换为LinqToSql调用(这是SQL的简化版本):
INSERT INTO [MyTable]
([Name], [Value])
SELECT
@name, @value
WHERE
NOT EXISTS(SELECT [Value] FROM [MyTable] WHERE [Value] = @value)
DB对要检查的字段没有约束,因此在这种特定情况下,需要手动进行检查.另外,还有许多项目会不断插入,因此我需要确保在发生这种特定插入时,不会重复使用value字段.我的第一个直觉是执行以下操作:
using (TransactionScope scope = new TransactionScope())
{
if (Context.MyTables.SingleOrDefault(t => t.Value == in.Value) != null)
{
MyLinqModels.MyTable t = new MyLinqModels.MyTable()
{
Name = in.Name,
Value = in.Value
};
// Do some stuff in the transaction
scope.Complete();
}
}
这是我第一次真正遇到这种情况,因此我想确保自己以正确的方式进行操作.这似乎是正确的,还是有人可以提出一种更好的方法来解决这个问题,而不必进行两次单独的呼叫?
编辑:我遇到一个类似的问题,与更新:
UPDATE [AnotherTable]
SET [Code] = @code
WHERE [ID] = @id AND [Code] IS NULL
我将如何用Linqtosql做同样的检查?我假设我需要进行获取,然后设置所有值并提交,但是如果有人从执行获取操作之初到执行更新时将[代码]更新为null以外的值,该怎么办?
与插入相同的问题…
解决方法:
如果数据库中没有唯一约束,则将其包装在TransactionScope中实际上不会防止冲突.它仅保证此事务的原子性.
在大批量方案中,完全有可能同时让两个同时进行的事务通过第一个空检查(这只是读取),然后再开始更新.在数据库本身中强制唯一性约束非常重要-如果您不能在此处执行此操作,那么就可以为您分担工作.
老实说,根据您的要求,我建议您使用存储过程代替. Linq to SQL是一个很棒的工具,但是它不能完成SQL可以做的所有事情;这似乎是您需要比L2S真正提供更多控制能力的情况之一.
标签:linq-to-sql,linq,c,sql-server,insert 来源: https://codeday.me/bug/20191210/2099370.html