LINQ é uma consulta tecnologia, mas acho que sabemos o que você quer dizer; você pode querer ser um pouco mais específico se isso é LINQ-to-SQL ou Entity Framework. Você também pode querer esclarecer o que "bulk" significa no seu caso... para 10-100 registros, você pode usar uma resposta diferente para 10.000 registros (onde
SqlBulkCopy
em uma tabela de preparo e um procedimento armazenado para importar no banco de dados seria a melhor ideia). Para um número relativamente baixo - basta usar sua ferramenta ORM para encontrar os registros - por exemplo, com LINQ-to-SQL (talvez com uma transação serializável abrangente) - e usando C# para ilustração (atualizado para mostrar loop e 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();
Na verdade, por motivos de desempenho, eu me pergunto se essa pode ser uma daquelas ocasiões em que uma chave natural faz sentido - ou seja, use
Tag
(o varchar
) como chave primária e duplique-a (como chave estrangeira) em VideoTags
- então você não precisa se juntar às Tags
mesa o tempo todo. Se os números forem maiores, é muito fácil usar
SqlBulkCopy
; basta colocar os dados em um DataTable
e empurre-o, depois faça o trabalho em TSQL.