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.