LINQ è una query tecnologia, ma penso che sappiamo cosa intendi; potresti voler essere un po 'più specifico se si tratta di LINQ-to-SQL o Entity Framework. Potresti anche voler chiarire cosa significa "bulk" nel tuo caso... per 10-100 record potresti usare una risposta diversa a 10.000 record (dove SqlBulkCopy
in una tabella di staging e una procedura memorizzata da importare nel db sarebbe l'idea migliore).
Per un numero relativamente basso, usa il tuo strumento ORM per trovare i record, ad esempio con LINQ-to-SQL (magari con una transazione serializzabile estesa) e usando C# per l'illustrazione (aggiornato per mostrare loop e cache ):
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();
In realtà, per motivi di prestazioni, mi chiedo se questa potrebbe essere una di quelle occasioni in cui una chiave naturale ha senso, ad esempio usare Tags
(il varchar
) come chiave primaria e duplicarla (come chiave esterna) in VideoTags
- allora non è necessario unirti ai Tags
tavolo tutto il tempo.
Se i numeri sono più grandi, è abbastanza facile usare SqlBulkCopy
; basta inserire i dati in una DataTable
e spingilo sopra, quindi esegui il lavoro in TSQL.