sql >> Database >  >> RDS >> Sqlserver

Ik heb een Tags-tabel. Hoe bulksgewijs invoegen met LINQ?

LINQ is een query technologie, maar ik denk dat we weten wat je bedoelt; je wilt misschien wat specifieker zijn of dit LINQ-to-SQL of Entity Framework is. Misschien wilt u ook verduidelijken wat "bulk" in uw geval betekent... voor 10-100 records kunt u een ander antwoord gebruiken dan 10.000 records (waarbij SqlBulkCopy in een verzameltabel en een opgeslagen procedure om te importeren in de db zou het beste idee zijn).

Voor een relatief laag aantal - gebruik gewoon uw ORM-tool om de records te vinden - bijvoorbeeld met LINQ-naar-SQL (misschien met een overspannende serialiseerbare transactie) - en gebruik C# ter illustratie (bijgewerkt om lus en cache weer te geven ):

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();

Om prestatieredenen vraag ik me af of dit een van die gelegenheden is waar een natuurlijke sleutel zinvol is - d.w.z. gebruik Tag (de varchar ) als de primaire sleutel en dupliceer deze (als externe sleutel) in VideoTags - dan hoef je niet lid te worden van de Tags tafel de hele tijd.

Als de getallen groter zijn, is het vrij eenvoudig om SqlBulkCopy te gebruiken; plaats de gegevens gewoon in een DataTable en duw het om, doe dan het werk in TSQL.




  1. sql-server:maak waar nodig indexen op externe sleutels

  2. Hoe reset je het SA-wachtwoord?

  3. Oracle IMMEDIATE UITVOEREN in een cursor

  4. MySQL:Foutcode:1242 Subquery retourneert meer dan 1 rij