Проверка дубликатов перед обновлением с помощью dapper linq c #

c# dapper linq

Вопрос

Я относительно новичок в Linq и Dapper, и я пытаюсь найти наиболее эффективный способ сделать вставку. У меня есть объект списка, который выглядит так:

public class Programs
{
    public int Id { get;set; }
    public int Desc { get;set; }
}

Объект списка заполняется из поля строки на странице, которое обычно содержит строку идентификаторов (например, 234, 342, 345, 398). Теперь в базе данных 234, 342, 345 уже существует, поэтому единственное, что мне действительно нужно вставить, - это 398 вместе с идентификатором записи. У меня уже есть метод, который существует, который отправляется и получает текущую существующую идентификатор программы в базе данных. Как я могу получить идентификатор программы, а затем сравнить два списка, прежде чем выполнить инструкцию insert? Могу ли я использовать Linq для сравнения? Есть ли способ лучше?

Метод, который получает идентификатор программы, выглядит следующим образом:

 public static List<Programs> GetPrograms(int id)
 {
    var sql = new StringBuilder();
    sql.Append("select Id, Desc from dbo.Programs where Id = @id");
    return con.Query<Programs>(sql.ToString(), new { Id = id }, commandType: CommandType.Text).ToList();
 }

Популярные ответы

После того, как вы посмотрели все варианты, кажется, что некоторые варианты моей ситуации - сделать одно из следующего:

  • сравните новые значения списка со старыми значениями списка в коде позади, затем используйте простой оператор insert, который передает только значения, которые были разными
  • перейдите к слою dao, перейдите к новой копии списка из db, сравните списки в коде, а затем вставьте разные
  • отправьте список в db, выполните сравнение на уровне sql с помощью цикла while и вставьте

Поскольку моя задача состояла в том, чтобы выполнить эту задачу с помощью Linq и Dapper, я выбрал первый вариант. Вот заявление linq, которое я сделал, чтобы получить только те значения, которые мне нужны:

 save.ProgramList = hiddenFieldProgramIds.Value.Split(',')
     .Select(n => new Programs(){ id = int.Parse(n) })
     .Where(n => !program.ProgramList.Select(d => d.id).Contains(n.id)).ToList();

Затем вызов dapper представляет собой просто оператор прямой вставки с использованием var, основанный на предыдущем совете.

 var sql = @"insert into dbo.programTable(Id) select @id";
 con.Execute(sql, new { id = id }, commandType: commandType.Text, commandTimeout: 5000);


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow