ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-12-10 05:09:03  阅读:295  来源: 互联网

标签:linq-to-sql linq c sql-server insert


我正在尝试将以下存储的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有