Я пытаюсь преобразовать следующий хранимый процесс в вызов 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, а затем установить все значения и отправить, но что, если кто-то обновит [Code] что-то отличное от null с того времени, когда я получаю get, когда выполняется обновление?
Та же проблема, что и при вставке ...