L oop через набор входных значений, которые, если удовлетворяет, обновить существующую запись или вставить новую запись - PullRequest
0 голосов
/ 12 июля 2020

Рассмотрение таблицы «Студент» как представления, содержащего строки StudentId, First Name, Last Name и EmailId (StudentId - это автоматически сгенерированное значение идентификатора, а EmailId является уникальным для всех записей).

Предполагая исходную таблицу выглядит так с данными:

enter image description here

I have a set of input values where the EmailIds need to be compared against the existing records and if present should update the value for First Name and Last Name else Insert a new record.What is the best way to accomplish this?

I am using DapperExtensions in the application so am ending up looping through the input List and calling the query. The input is a list which looks like something like this:

[{FirstName: Adam1, LastName: Robert1, EmailId: adm.robert@gmail.com},
{FirstName: Joanne, LastName: Williams, EmailId: joanne.williams@gmail.com}]

The current query that I came up for updating with only a single value is something like this:

IF EXISTS (SELECT * FROM Student WHERE EmailId='SomeValue')
    UPDATE Student SET (...) WHERE EmailId='SomeValue'
ELSE
    INSERT INTO Student (...)

The expected output with the referred data and input values above should be thus:

введите описание изображения здесь

Не уверены, что можно сделать что-то подобное?

1 Ответ

0 голосов
/ 13 июля 2020

Нет прямого (однократного вызова) способа сделать это с помощью Dapper-Extensions. Вы можете сделать это с помощью Dapper, но это другой вопрос; Я не буду здесь объяснять.

С Dapper-Extensions, если вам комфортно с несколькими вызовами, могут помочь следующие:

Используйте метод Count с надлежащими предикат для проверки существования записи.

Если существует, вызовите Update. Обратите внимание, что обновление также обновит ваш уникальный ключ; но это не дает никакого отрицательного эффекта.

Если не существует, звоните Insert.

Недостатком этого подхода, очевидно, является как минимум два вызова, выполняемых каждый раз. Но я не думаю, что звонок Count действительно дорогостоящий. Если вы добавите индекс в столбец электронной почты, вы не увидите большого снижения производительности.

...