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.