Ich habe es hier gesehen
So fügen Sie eine IEnumerable <T> -Kollektion mit dapper-dot-net ein
Wie dapper ist in der Lage, IEnumerable
als Eingabe-Parameter zu behandeln und mehrere Befehle für jedes Mitglied der Sammlung zu versenden.
In meinem Fall habe ich eine IEnumerable<int> Categories
und eine int SurveyId
und ich möchte diese Eins-zu-viele-Beziehung in eine separate Zuordnungstabelle namens SurveyCategories
Gibt es eine LINQ-Erweiterung, die ich verwenden könnte, um diese Kategorien mit derselben SurveyId
zu verketten, ähnlich wie .Concat()
?
Oder sollte ich die Auflistung durchgehen und eine neue Objektliste mit den Eigenschaften SurveyId und CategoryId erstellen?
Sie können eine Einfügung für die Umfragen durchführen und dann alle Umfragekategorien auf einmal einfügen, indem Sie die folgende Linq-Abfrage als Parameter verwenden:
var allSurveyCategories = surveys.SelectMany(s =>
s.Categories.Select(c => new{SurveyId = s.SurveyId, CategoryId = c}));
Hier ist, was ich bisher gemacht habe, ich habe die Kategorien leicht in ein int-Array mit dem Namen CategoryIds geändert, nur weil es in meinem System verwendet wird, aber ich hätte 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: Hier ist mein neuer Ansatz mit SelectMany
basierend auf SelectMany
Antwort, die Verwendung von Enumerable.Repeat (..) ist ein bisschen wie ein Hack, aber das ist die einzige Möglichkeit, die ich bis jetzt machen konnte.
...
var surveyCategories = source.CategoryIds.SelectMany(
s => Enumerable.Repeat(surveyId, 1),
(c, s) => new { SurveyID = s, CategoryID = c });
...