0

ここ見てきた

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

dapper がIEnumerable入力パラメーターとして処理し、コレクションの各メンバーに対して複数のコマンドをディスパッチする方法。

私の場合、 と がありIEnumerable<int> Categoriesint SurveyIdこの 1 対多の関係を別のマッピング テーブルに挿入したいと考えています。SurveyCategories

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

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

4

2 に答える 2

1

次の linq クエリをパラメーターとして使用して、調査に対して 1 つの挿入を実行し、すべての調査カテゴリを一度に挿入できます。

var allSurveyCategories = surveys.SelectMany(s =>
     s.Categories.Select(c => new{SurveyId = s.SurveyId, CategoryId = c}));
于 2012-12-30T16:38:48.413 に答える
0

これまでに行ったことは次のとおりです。システムでの使用方法のために、カテゴリをCategoryIdsというint配列にわずかに変更しましたが、行うこともできました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);
        }

更新:SelectMany Eren の回答に基づいて 使用する新しいアプローチを次に示します。

    ...
        var surveyCategories = source.CategoryIds.SelectMany(
            s => Enumerable.Repeat(surveyId, 1),
            (c, s) => new { SurveyID = s, CategoryID = c });
    ...
于 2012-12-30T16:24:45.560 に答える