Suchen nach Duplikaten vor dem Aktualisieren mit Dapper LINQ c #

c# dapper linq

Frage

Ich bin relativ neu bei Linq und Dapper und ich versuche, den effektivsten Weg zu finden, um einen Einsatz passieren zu lassen. Ich habe ein Listenobjekt, das so aussieht:

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

Das Listenobjekt wird von einem Zeichenfolgenfeld auf der Seite aufgefüllt, das normalerweise eine Folge von IDs enthält (z. B. 234, 342, 345, 398). Jetzt in der Datenbank 234, 342, 345 bereits vorhanden, so ist die einzige, die ich wirklich einfügen muss 398 zusammen mit der Datensatz-ID. Ich habe bereits eine Methode, die geht und die aktuell vorhandenen Programm-IDs in der Datenbank abruft. Bekomme ich die Programm-IDs und vergleiche dann die beiden Listen, bevor ich die insert-Anweisung ausführe? Kann ich Linq für den Vergleich verwenden? Gibt es einen besseren Weg?

Die Methode, die die Programm-IDs abruft, sieht folgendermaßen aus:

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

Beliebte Antwort

Nachdem ich einige Optionen betrachtet habe, scheint es, als ob einige Optionen für meine Situation eine der folgenden Möglichkeiten bieten:

  • Vergleichen Sie die neuen Listenwerte mit den alten Listenwerten im Code dahinter und verwenden Sie dann eine einfache insert-Anweisung, die nur Werte übergibt, die unterschiedlich sind
  • Übergeben Sie die Liste an DAO-Ebene, gehen Sie eine neue Kopie der Liste aus der DB, vergleichen Sie die Listen in Code, dann fügen Sie nur die verschiedenen ein
  • sende die Liste an die db, führe den Vergleich auf SQL-Ebene mit einer while-Schleife aus und füge sie ein

Da ich diese Aufgabe mit Linq und Dapper erledigen wollte, habe ich mich für die erste Option entschieden. Hier ist die Linq-Anweisung, die ich gemacht habe, um nur die Werte zu erhalten, die ich brauchte:

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

Dann ist der Dapper-Aufruf nur eine einfache Insert-Anweisung, die eine var basierend auf dem vorherigen Rat verwendet.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum