我在这里看到了
How to insert an IEnumerable<T> collection with dapper-dot-net
dapper如何处理IEnumerable
作为输入参数并为集合的每个成员分派多个命令。
在我的情况下,我有一个IEnumerable<int> Categories
和一个int SurveyId
,我想将这个一对多关系插入一个名为SurveyCategories
我是否可以使用LINQ扩展来将这些类别与同一SurveyId
连接起来,类似于.Concat()
?
或者我应该遍历集合并使用SurveyId和CategoryId属性构建一个新的对象列表?
答案 0 :(得分:1)
您可以为调查执行一次插入,然后使用以下linq查询作为参数立即插入所有调查类别:
var allSurveyCategories = surveys.SelectMany(s =>
s.Categories.Select(c => new{SurveyId = s.SurveyId, CategoryId = c}));
答案 1 :(得分: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 });
...