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

Jeg har en tags-tabel. Hvordan masseindsættes ved hjælp af LINQ?

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.




  1. Hvordan får man flere optællinger med én SQL-forespørgsel?

  2. ? LIKE (kolonne || '%)'

  3. Indstil en standard LIMIT i PDO/MySQL, når ingen LIMIT er indstillet

  4. Læserløsninger til Special Islands-udfordringen