sql >> Databasteknik >  >> RDS >> Sqlserver

Jag har en Tags-tabell. Hur bulkar man in med LINQ?

LINQ är en fråga teknik, men jag tror att vi vet vad du menar; du kanske vill vara lite mer specifik om detta är LINQ-till-SQL eller Entity Framework. Du kanske också vill förtydliga vad "bulk" betyder i ditt fall... för 10-100 poster kan du använda ett annat svar än 10 000 poster (där SqlBulkCopy in i en mellanställningstabell och en lagrad procedur för att importera vid db skulle vara den bästa idén).

För ett relativt lågt antal - använd bara ditt ORM-verktyg för att hitta posterna - till exempel med LINQ-till-SQL (kanske med en spännande serialiserbar transaktion) - och använd C# som illustration (uppdaterat för att visa loop och cache stark> ):

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

Av prestationsskäl undrar jag faktiskt om detta kan vara ett av de tillfällen där en naturlig nyckel är vettig - dvs använd Tag (varchar ) som primärnyckel, och duplicera den (som en främmande nyckel) i VideoTags - då behöver du inte gå med i Tags bord hela tiden.

Om siffrorna är större är det ganska enkelt att använda SqlBulkCopy; lägg bara in data i en DataTable och tryck över det, gör sedan arbetet i TSQL.




  1. Hur du snabbar upp din SQL-server med hjälp av databasprestandaövervakning

  2. SQL-sats för att använda fördefinierade värdelista som en SQL-tabell

  3. Använd wp_query efter att ha ändrat databas via nya wpdb

  4. Kan inte installera mysqlclient i virtualenv på nya Mac