Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ich habe eine Tag-Tabelle. Wie kann man Masseneinfügungen mit LINQ durchführen?

LINQ ist eine Abfrage Technologie, aber ich denke, wir wissen, was Sie meinen; Vielleicht möchten Sie etwas genauer sagen, ob es sich um LINQ-to-SQL oder Entity Framework handelt. Vielleicht möchten Sie auch klären, was "Masse" in Ihrem Fall bedeutet ... für 10-100 Datensätze könnten Sie eine andere Antwort als für 10.000 Datensätze verwenden (wobei SqlBulkCopy in eine Staging-Tabelle und eine gespeicherte Prozedur zum Importieren in die Datenbank wäre die beste Idee).

Für eine relativ geringe Anzahl – verwenden Sie einfach Ihr ORM-Tool, um die Datensätze zu finden – zum Beispiel mit LINQ-to-SQL (möglicherweise mit einer übergreifenden serialisierbaren Transaktion) – und verwenden Sie C# zur Veranschaulichung (aktualisiert, um Schleife und Cache anzuzeigen ):

Dictionary<string,Tag> knownTags = new Dictionary<string,Tag>();
foreach(... your data ...) {
    Tag tag;
    if(!knownTags.TryGetValue(tagName, out tag)) {
        tag = ctx.Tags.SingleOrDefault(t => t.Name == tagName);
        if(tag == null) {
            tag = new Tag { Name = tagName };
            ctx.Tags.InsertOnSubmit(tag);
        }
        knownTags.Add(tagName, tag);
    }
    // insert video tag
}
ctx.SubmitChanges();

Eigentlich frage ich mich aus Performance-Gründen, ob dies eine der Gelegenheiten ist, bei denen ein natürlicher Schlüssel sinnvoll ist - dh Tag verwenden (die varchar ) als Primärschlüssel und dupliziere ihn (als Fremdschlüssel) in VideoTags - dann müssen Sie den Tags nicht beitreten Tisch die ganze Zeit.

Wenn die Zahlen größer sind, ist es ziemlich einfach, SqlBulkCopy zu verwenden; fügen Sie die Daten einfach in eine DataTable ein und verschieben Sie es, dann erledigen Sie die Arbeit in TSQL.