0

我在这里见过

如何使用 dapper-dot-net 插入 IEnumerable<T> 集合

dapper 如何IEnumerable作为输入参数处理并为集合的每个成员分派多个命令。

在我的情况下,我有一个IEnumerable<int> Categories和一个int SurveyId,我想将这种一对多关系插入到一个单独的映射表中,称为SurveyCategories

是否有一个 LINQ 扩展,我可以使用它来连接这些具有相同的类别SurveyId,类似于.Concat()

或者我应该遍历集合并建立一个具有 SurveyId 和 CategoryId 属性的新对象列表?

4

2 回答 2

1

您可以对调查进行一次插入,然后使用以下 linq 查询作为参数一次插入所有调查类别:

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);
        }

更新: 这是我根据 Eren 的回答使用的新方法SelectMany,使用 Enumerable.Repeat(..) 有点小技巧,但这是迄今为止我能够做同样事情的唯一方法。

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