Я только начал использовать Dapper, и у меня возникла следующая проблема.Вставить несколько значений и вернуть несколько значений
Я хочу вставить кучу записей и вернуть вставленные записи вместе с автоматически увеличивающимся идентификатором.
Использование Postgres, я хочу, чтобы запустить эквивалент этого запроса:
INSERT INTO players (name)
VALUES ('Player1'), ('Player2'), ('Player3'), ('Player4'), ('Player5')
RETURNING id, name;
Использование щеголеватый для выполнения этого запроса в списке игроков и сериализация обратно в список игроков (с идентификаторами) Я думал Я мог бы сделать это:
public class Player
{
public int Id { get; set; }
public string Name { get; set; }
}
var players = new List<Player> { new Player { Name = "Player1" }, new Player { Name = "Player2" }, new Player { Name = "Player3" }, new Player { Name = "Player4" }, new Player { Name = "Player5" }}
connection.Query<Player>("INSERT INTO players (name) VALUES (@Name) \r\n" +
"RETURNING id, name, tag;",
players);
Это выдает следующее сообщение об ошибке (это список игроков, каждый с именем):
Parameter '@Name' referenced in SQL but not found in parameter list
Я считаю, что Query() может не поддерживать списки параметров, поэтому я попробовал connection.Execute(). Выполнять работу, но, очевидно, он не возвращает обратно вставленных игроков с идентификаторами.
Стоит отметить, что я могу сделать INSERT и RETURNING таким образом, когда я вставляю только одно значение.
Кто-нибудь знает, как я могу сделать INSERT и RETURNING для нескольких значений, подобных этому с Dapper?
Update
У меня есть это (немного грязный) решение:
var sb = new StringBuilder();
sb.Append("INSERT INTO players (name) VALUES \r\n");
var parameters = new ExpandoObject() as IDictionary<string, object>;
var values = new List<string>();
for (int i = 0; i < players.Count; i++)
{
var p = players[i];
values.Add($"(@Name{i})");
parameters[$"Name{i}"] = p.Name;
}
sb.Append(string.Join(", \r\n", values));
sb.Append(" \r\nRETURNING id, name, tag;");
// parameters = { Name1 = "Player1", Name2 = "Player2, ... etc}
var ret = connection.Query<Player>(sb.ToString(), parameters);
Так построения ExpandoObject со свойствами из моих игроков, а затем проходящее, что в Dapper Query(). Это работает, но кажется довольно грязным. Любые предложения о том, как улучшить это?
Я не знаком с postgresql, поэтому не могу комментировать этот фактический запрос, но для возврата нескольких наборов результатов вам нужно использовать 'connection.QueryMultiple()'. Вот [аналогичный вопрос] (http://stackoverflow.com/questions/19337468/multiple-sql-statements-in-one-roundtrip-using-dapper-net) – markpsmith
@markpsmith Спасибо за ваше предложение. QueryMultiple для нескольких SELECT, как в связанном вопросе. Я не думаю, что это применимо здесь. – janderson