Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Eu tenho uma tabela de tags. Como inserir em massa usando LINQ?


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.