Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ho una tabella dei tag. Come inserire in blocco utilizzando LINQ?

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.