sql >> Databáze >  >> RDS >> Sqlserver

Mám tabulku značek. Jak hromadně vložit pomocí LINQ?

LINQ je dotaz technologie, ale myslím, že víme, co máte na mysli; možná budete chtít být trochu konkrétnější, zda se jedná o LINQ-to-SQL nebo Entity Framework. Možná budete chtít také objasnit, co ve vašem případě znamená „hromadné“... pro 10–100 záznamů můžete použít jinou odpověď na 10 000 záznamů (kde SqlBulkCopy do pracovní tabulky a uložené procedury k importu do db by byl nejlepší nápad).

Pro relativně nízké číslo - stačí použít váš ORM nástroj k nalezení záznamů - například pomocí LINQ-to-SQL (možná s rozsáhlou serializovatelnou transakcí) - a pro ilustraci použít C# (aktualizováno pro zobrazení smyčky a mezipaměti silný> ):

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

Vlastně z důvodů výkonu mě napadá, jestli to může být jedna z těch příležitostí, kdy přirozený klíč dává smysl – tj. použijte Tag (varchar ) jako primární klíč a duplikujte jej (jako cizí klíč) v VideoTags - pak se nemusíte připojovat k Tags tabulky po celou dobu.

Pokud jsou čísla větší, je docela snadné použít SqlBulkCopy; stačí vložit data do DataTable a přesuňte jej a poté proveďte práci v TSQL.




  1. SQL:spouštěč, který zabrání vložení neplatných dat do tabulky

  2. počet řádků, které se vyskytují pro každé datum v časovém období sloupců

  3. žádný záznam pg_hba.conf pro hostitele

  4. Doctrine DQL spojení na sloupcích s možnou hodnotou Null