gpt4 book ai didi

c# - 如何在 Linq to Sql 的插入或更新中使用 where 子句?

转载 作者:行者123 更新时间:2023-11-30 16:34:06 25 4
gpt4 key购买 nike

我正在尝试将以下存储过程转换为 LinqToSql 调用(这是 SQL 的简化版本):

INSERT INTO [MyTable]
([Name], [Value])
SELECT
@name, @value
WHERE
NOT EXISTS(SELECT [Value] FROM [MyTable] WHERE [Value] = @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 进行同样的检查?我假设我需要执行 get,然后设置所有值并提交,但是如果从我执行 get 到更新执行时有人将 [Code] 更新为 null 以外的内容怎么办?

和插入一样的问题...

最佳答案

如果数据库中没有唯一约束,将其包装在 TransactionScope 中实际上并不能防止冲突。它只保证这个事务的原子性。

在大容量场景中,两个同时发生的事务在开始更新之前完全有可能通过第一个 null 检查(这只是一次读取)。在数据库本身中强制执行唯一性约束非常重要 - 如果您不能在此处执行此操作,那么您的工作就完成了。

老实说,根据您的要求,我建议改用存储过程。 Linq to SQL 是一个很棒的工具,但它不能做 SQL 可以做的一切;这似乎是您需要比 L2S 真正给您更多控制权的情况之一。

关于c# - 如何在 Linq to Sql 的插入或更新中使用 where 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2669924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com