Vérification des doublons avant la mise à jour avec dapper linq c #

c# dapper linq

Question

Je suis relativement nouveau avec Linq et Dapper et j'essaie de trouver le moyen le plus efficace de faire un insert. J'ai un objet liste qui ressemble à ceci:

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

L'objet de liste est rempli à partir d'un champ de chaîne sur la page qui contient généralement une chaîne d'ID (par exemple, 234, 342, 345, 398). Maintenant, dans la base de données 234, 342, 345 existe déjà, donc le seul que j'ai vraiment besoin d'insérer est 398 avec l'ID d'enregistrement. J'ai déjà une méthode existante qui récupère les identifiants de programmes existants dans la base de données. Est-ce que je vais chercher les identifiants du programme, puis compare les deux listes avant d'exécuter l'instruction d'insertion? Puis-je utiliser Linq pour faire la comparaison? Y a-t-il une meilleure façon?

La méthode qui obtient l'identifiant du programme ressemble à ceci:

 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();
 }

Réponse populaire

Après avoir examiné toutes les options, il semble que certaines options pour ma situation soient les suivantes:

  • comparer les nouvelles valeurs de liste aux anciennes valeurs de liste dans le code, puis utiliser une simple instruction d'insertion qui ne transmet que des valeurs différentes
  • passer la liste à la couche dao, aller chercher une nouvelle copie de la liste depuis la base de données, comparer les listes dans le code puis insérer uniquement les différentes
  • envoyer la liste à la base de données, faire la comparaison au niveau SQL en utilisant une boucle while et insérer

Puisque mon objectif était d'accomplir cette tâche en utilisant Linq et Dapper, j'ai opté pour la première option. Voici la déclaration linq que j'ai faite pour obtenir uniquement les valeurs dont j'avais besoin:

 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();

Ensuite, l'appel dapper est juste une instruction d'insertion directe utilisant un var basé sur les conseils précédents.

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi