Как использовать Dapper со сложными запросами SQL

Рейтинг: 0Ответов: 1Опубликовано: 13.04.2023

У меня есть две таблицы User(id, name, surname, FK_id_adress) и таблица Adress (id, city ,street, house, apartament), при регистрации пользователя нужно создать его адрес и самого юзера, я не понимаю как сделать это в одном запросе, фронтенд делаю на React.

using (var conn = new NpgsqlConnection(DataContext.ConnectionString)
{
    conn.Open();
    string sql = "Insert into User" +
                 "Values @";
    return await conn.ExecuteAsync(sql, user);
}

Ответы

▲ 0

Если я правильно понимаю, что таблицы связываются по полю id, то

WITH cte AS (
    INSERT INTO User(name, surname, FK_id_adress)
    VALUES ( @1, @2, @3 )
    RETURNING id
    )
INSERT INTO Address (id, city, street, house, apartament)
SELECT id, @4, @5, @6, @7
FROM cte;

где @N - отдельный параметр номер N в списке значений для (name, surname, FK_id_adress, city, street, house, apartament).

И да, параметры придётся передавать поштучно.


Впрочем, возможна и такая форма:

WITH 
cte1 (x1, x2, x3, x4, x5, x6, x7) AS (
    SELECT @
    ),
cte2 AS (
    INSERT INTO User(name, surname, FK_id_adress)
    SELECT x1, x2, x3 FROM cte1
    RETURNING id
    )
INSERT INTO Address (id, city, street, house, apartament)
SELECT cte2.id, cte1.x4, cte1.x5, cte1.x6, cte1.x7
FROM cte1 
CROSS JOIN cte2;

В этом случае параметры можно передавать кортежем.