Как вставить несколько записей, используя Dapper, а также включить другие параметры Dynami c? - PullRequest
0 голосов
/ 24 января 2020

Вот сокращенный пример того, что я пытаюсь сделать:

var stuffTOSave = new List<SomeObject> {
    public int OtherTableId { get; set; }
    public List<Guid> ComponentIds { get; set; }
};

var sql = @"CREATE TABLE Components( ComponentId uniqueidentifier PRIMARY KEY )
INSERT INTO Components VALUES (@WhatGoesHere?)

SELECT * FROM OtherTable ot
JOIN Components c on c.ComponentId = ot.ComponentId
WHERE Id = @OtherTableId

DROP TABLE Components"

Connection.Execute(sql, stuffToSave);

Я знаю из других вопросов SO , что вы можете передать список в оператор вставки с помощью Dapper , но я не могу найти примеры, которые передают список, а также другой параметр (в моем примере, OtherTableId), или которые имеют список не-объектов (List<Guid> в отличие от List<SomeObject>, который имеет свойства с именами для ссылки).

Для второго вопроса я мог бы выбрать ComponentId s в списке, чтобы дать им имя вроде:

stuffToSave.ComponentIds.Select(c => new { ComponentId = c })

, но тогда я не уверен, что добавить в мой запрос sql, чтобы dapper понимал, что свойство ComponentId можно получить из моего списка ComponentIds (строка 7)

1 Ответ

0 голосов
/ 24 января 2020

Я все еще хотел бы знать реальный способ достижения этого, но у меня есть этот обходной путь, который использует интерполяцию строк:

var sql = $@"CREATE TABLE Components( ComponentId uniqueidentifier PRIMARY KEY )
    INSERT INTO Components VALUES ('{string.Join($"'),{Environment.NewLine}('", request.ComponentIds)}')

    SELECT * FROM OtherTable ot
    JOIN Components c on c.ComponentId = ot.ComponentId
    WHERE Id = @OtherTableId

    DROP TABLE Components"

Я не беспокоюсь о SQL Инъекции, так как это просто интерполяция список гидов, но я бы предпочел избегать этого метода, если это возможно.

...