Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

J'ai une table de balises. Comment faire une insertion en masse avec LINQ ?

LINQ est une requête la technologie, mais je pense que nous savons ce que vous voulez dire ; vous voudrez peut-être être un peu plus précis, qu'il s'agisse de LINQ-to-SQL ou d'Entity Framework. Vous voudrez peut-être également clarifier ce que "en masse" signifie dans votre cas... pour 10 à 100 enregistrements, vous pouvez utiliser une réponse différente pour 10 000 enregistrements (où SqlBulkCopy dans une table intermédiaire et une procédure stockée à importer dans la base de données serait la meilleure idée).

Pour un nombre relativement faible - utilisez simplement votre outil ORM pour trouver les enregistrements - par exemple avec LINQ-to-SQL (peut-être avec une transaction sérialisable étendue) - et en utilisant C# à titre d'illustration (mis à jour pour afficher la boucle et le 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();

En fait, pour des raisons de performances, je me demande si cela pourrait être l'une de ces occasions où une clé naturelle a du sens - c'est-à-dire utiliser Tag (le varchar ) comme clé primaire, et dupliquez-la (comme clé étrangère) dans VideoTags - alors vous n'avez pas besoin de vous joindre aux Tags table tout le temps.

Si les nombres sont plus grands, il est assez facile d'utiliser SqlBulkCopy; il suffit de mettre les données dans un DataTable et poussez-le, puis faites le travail dans TSQL.