insertion d'un à plusieurs en utilisant dapper dot net

c# dapper linq

Question

J'ai vu ici

Comment insérer une collection IEnumerable <T> avec dapper-dot-net

comment dapper est capable de gérer IEnumerable tant que IEnumerable d'entrée et d'envoyer plusieurs commandes pour chaque membre de la collection.

Dans mon cas, j'ai un IEnumerable<int> Categories et un int SurveyId et je veux insérer cette relation un-à-plusieurs dans une table de mappage distincte appelée SurveyCategories

Existe-t-il une extension LINQ que je pourrais utiliser pour concaténer ces catégories avec le même SurveyId , similaire à .Concat() ?

Ou devrais-je parcourir la collection et créer une nouvelle liste d'objets avec les propriétés SurveyId et CategoryId?

Réponse acceptée

Vous pouvez effectuer une insertion pour les enquêtes, puis insérer toutes les catégories d'enquête en même temps en utilisant la requête linq suivante comme paramètre:

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

Réponse populaire

Voici ce que j'ai fait jusqu'ici, j'ai légèrement changé les catégories en un tableau int appelé CategoryIds simplement en raison de son utilisation dans mon système, mais j'aurais pu faire 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);
        }

UPDATE: Voici ma nouvelle approche utilisant SelectMany basée sur la réponse d'Eren, l'utilisation de Enumerable.Repeat (..) est un peu un hack mais c'est la seule façon dont j'ai pu faire la même chose jusqu'à présent.

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi