LINQ er en forespørgsel teknologi, men jeg tror, vi ved, hvad du mener; du vil måske være lidt mere specifik, om dette er LINQ-til-SQL eller Entity Framework. Du vil måske også præcisere, hvad "bulk" betyder i dit tilfælde... for 10-100 poster kan du bruge et andet svar til 10.000 poster (hvor SqlBulkCopy
ind i en iscenesættelsestabel og en lagret procedure til at importere ved db ville være den bedste idé).
For et relativt lavt antal - brug blot dit ORM-værktøj til at finde posterne - for eksempel med LINQ-til-SQL (måske med en spændende serialiserbar transaktion) - og brug C# til illustration (opdateret til at vise loop og cache stærk> ):
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();
Faktisk spekulerer jeg af præstationsmæssige årsager på, om dette kan være en af de lejligheder, hvor en naturlig nøgle giver mening - dvs. brug Tag
(varchar
) som den primære nøgle, og dupliker den (som en fremmednøgle) i VideoTags
- så behøver du ikke tilmelde dig Tags
bord hele tiden.
Hvis tallene er større, er det ret nemt at bruge SqlBulkCopy
; bare læg dataene ind i en DataTable
og skub det over, og gør derefter arbejdet i TSQL.