数据库
首页 > 数据库> > CodeGo.net>如何在LINQ的SQL插入或更新有一个where子句?

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