ダッパドットネットを使用した1対多の挿入

c# dapper linq

質問

私はここに見ました

dapper-dot-netでIEnumerable <T>コレクションを挿入する方法

dapperはIEnumerableを入力パラメータとして扱い、コレクションの各メンバに対して複数のコマンドをディスパッチすることができます。

私の場合、 IEnumerable<int> Categoriesint SurveyIdあり、この1 SurveyCategories関係をSurveyCategoriesという別のマッピングテーブルに挿入したい

.Concat()と同様に、これらのカテゴリを同じSurveyIdで連結するために使用できるLINQ拡張機能はありますか?

または、コレクションをループして、SurveyIdとCategoryIdのプロパティを持つオブジェクトの新しいリストを作成する必要がありますか?

受け入れられた回答

アンケートに1つの挿入を行い、次のlinqクエリをパラメータとして使用して、すべてのアンケートカテゴリを一度に挿入することができます。

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

人気のある回答

ここで私がこれまで行ってきたのは、CategoryIdsという名前の配列を私のシステムでどのように使用されているかによってちょっと変わったのですが、 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);
        }

更新: Erenの答えに基づいてSelectManyを使用する私の新しいアプローチは、Enumerable.Repeat(..)の使用はちょっとしたハックですが、これは今まで同じことをやり遂げることができた唯一の方法です。

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow