inserción de uno a muchos usando dapper dot net

c# dapper linq

Pregunta

He visto aquí

Cómo insertar una colección IEnumerable <T> con dapper-dot-net

cómo dapper es capaz de manejar IEnumerable como un IEnumerable entrada y enviar múltiples comandos para cada miembro de la colección.

En mi caso, tengo un IEnumerable<int> Categories y un int SurveyId y quiero insertar esta relación de uno a muchos en una tabla de asignación separada llamada SurveyCategories

¿Existe una extensión LINQ que pueda usar para concatenar estas categorías con el mismo SurveyId , similar a .Concat() ?

¿O debería recorrer la colección y crear una nueva lista de objetos con las propiedades SurveyId y CategoryId?

Respuesta aceptada

Puede hacer una inserción para las encuestas y luego insertar todas las categorías de encuesta al mismo tiempo usando la siguiente consulta de linq como parámetro:

var allSurveyCategories = surveys.SelectMany(s =>
     s.Categories.Select(c => new{SurveyId = s.SurveyId, CategoryId = c}));

Respuesta popular

Esto es lo que he hecho hasta ahora, cambié las categorías ligeramente a una matriz int llamada CategoryIds simplemente debido a cómo se usa en mi sistema, pero podría haber hecho survey.Categories.Select(c => c.Id).Zip(...

// insert using source data from form post matching a ISurvey interface, where .Id will be 0
var surveyId = conn.Query<int>("INSERT ... " + 
                               "SELECT CAST(SCOPE_IDENTITY() AS INT)")
                               .First();

        if(source.CategoryIds != null && source.CategoryIds.Count() > 0) {
            var surveyCategories = source.CategoryIds
                    .Zip(
                        Enumerable.Repeat<int>(
                            surveyId,
                            source.CategoryIds.Count()
                        ),
                    (c, s) => new { SurveyID = s, CategoryID = c }
            );

            conn.Execute(@"INSERT INTO [SurveyCategories] " + 
                         "VALUES (@SurveyID, @CategoryID)", 
                         surveyCategories);
        }

ACTUALIZACIÓN: Aquí está mi nuevo enfoque usando SelectMany basado en la respuesta de Eren, el uso de Enumerable.Repeat (..) es un poco hack pero esta es la única forma en que he podido hacer lo mismo hasta ahora.

    ...
        var surveyCategories = source.CategoryIds.SelectMany(
            s => Enumerable.Repeat(surveyId, 1),
            (c, s) => new { SurveyID = s, CategoryID = c });
    ...


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow