sql >> Base de Datos >  >> RDS >> Sqlserver

Tengo una tabla de etiquetas. ¿Cómo realizar una inserción masiva con LINQ?

LINQ es una consulta tecnología, pero creo que sabemos a lo que te refieres; es posible que desee ser un poco más específico si se trata de LINQ-to-SQL o Entity Framework. También es posible que desee aclarar qué significa "en masa" en su caso ... para 10-100 registros, puede usar una respuesta diferente a 10,000 registros (donde SqlBulkCopy en una tabla de preparación y un procedimiento almacenado para importar en la base de datos sería la mejor idea).

Para un número relativamente bajo, solo use su herramienta ORM para encontrar los registros, por ejemplo, con LINQ-to-SQL (quizás con una transacción serializable ampliada), y use C# para ilustración (actualizado para mostrar bucle y caché ):

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 realidad, por razones de rendimiento, me pregunto si esta podría ser una de esas ocasiones en las que una clave natural tiene sentido, es decir, usar Tag (el varchar ) como clave principal y duplicarla (como clave externa) en VideoTags - entonces no necesitas unirte a las Tags mesa todo el tiempo.

Si los números son más grandes, es bastante fácil usar SqlBulkCopy; simplemente coloque los datos en una DataTable y empújelo, luego haga el trabajo en TSQL.