Я вообще ненавижу хранимые процедуры, но это probably
идеальный случай для их использования. Мой TSQL ржавый, но это должно дать представление.
CREATE PROCEDURE dbo.InsertOrUpdateScore
(
@id as Int,
@date as DateTime,
@result as varchar(20)
)
AS
if not exists(SELECT id FROM Scores WHERE id = @id AND date = @date)
begin
INSERT INTO Scores (id, date, result) values (@id, @date, @result)
end
else
begin
UPDATE Scores
SET result = @result
WHERE id = @id AND date = @date
end
GO
Теперь в браузере сервера LINQ выберите сущность Score и измените ее поведение INSERT и UPDATE, чтобы использовать только что созданную вами хранимую процедуру. Убедитесь, что пользователь, обращающийся к базе данных, имеет разрешение EXECUTE на SPROC.
Это должно работать немного быстрее, чем ваша версия. Вы торгуете предложением IN для N SELECT по индексу, который может быть быстрее. Однако результирующий набор предложения IN не передается обратно клиенту по сети, что может сэкономить немало времени.
Опишите точно, сколько времени занимает ваш метод, прежде чем реализовывать это, так что вы можете оценить, действительно ли это быстрее.
Я не уверен, что это единственный способ создать Score в вашем приложении, но вы можете рассмотреть случай, когда вы ВСТАВЛЯЕТЕ запись, у которой еще нет идентификатора. Вам нужно изменить SPROC так, чтобы он разрешал @id
как null
, и соответственно обрабатывал INSERT.
Тогда это должно просто быть:
db.Scores.InsertAllOnSubmit(newScoreList);