Verifica dei duplicati prima di aggiornare con dapper linq c #

c# dapper linq

Domanda

Sono relativamente nuovo a Linq e Dapper e sto cercando di trovare il modo più efficace per realizzare un inserto. Ho un oggetto lista che assomiglia a questo:

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

L'oggetto elenco viene popolato da un campo stringa sulla pagina che in genere contiene una stringa di Id (ad es. 234, 342, 345, 398). Ora nel database 234, 342, 345 esiste già, quindi l'unico che ho davvero bisogno di inserire è 398 insieme all'ID del record. Ho già un metodo che esiste e ottiene gli ID del programma attualmente esistenti nel database. Vado a prendere l'Id del programma e quindi a confrontare le due liste prima di eseguire l'istruzione di inserimento? Posso usare Linq per fare il confronto? C'è un modo migliore?

Il metodo che ottiene l'ID del programma è simile a questo:

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

Risposta popolare

Dopo aver esaminato tutte le opzioni, sembra che alcune opzioni per la mia situazione siano di eseguire una delle seguenti operazioni:

  • confrontare i nuovi valori di lista con i vecchi valori di lista nel codice sottostante, quindi utilizzare una semplice istruzione di inserimento che trasmette solo valori diversi
  • passa la lista al livello dao, vai a prendere una nuova copia della lista dal db, confronta gli elenchi nel codice quindi inserisci solo quelli diversi
  • invia la lista al db, effettua il confronto a livello di SQL utilizzando un ciclo while e inserisci

Dal momento che il mio obiettivo era realizzare questo compito usando Linq e Dapper, ho optato per la prima opzione. Ecco la dichiarazione di linq che ho fatto per ottenere solo i valori di cui avevo bisogno:

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

Quindi la call dapper è semplicemente un'istruzione insert diretta usando una var basata sul consiglio precedente.

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow