Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: Combining multiple Statements #706

Open
Xzelsius opened this issue Feb 16, 2024 · 1 comment
Open

Question: Combining multiple Statements #706

Xzelsius opened this issue Feb 16, 2024 · 1 comment

Comments

@Xzelsius
Copy link

Hello

I know it is possible to combine multiple SELECT statements, but I have a use case where I could use some sort of combine Query for delete + insert.

In this specific use case, I need to delete all rows (1 + n) that match a certain ID, and then insert new rows again in one transaction.
There are alternatives like delete only what should not be there and insert only what is missing. But in a event-sourced system this can get out of hand quickly.

Right now we do this using

Query().AsDelete().Where(new { foreign_id = e.Id })

and then loop over what we have to insert and do

Query().AsInsert(new { .... }) 

Which results in something like

operations[0]: "delete from ... where foreign_id = ..."
operations[1]: "insert into ... values (...)"
operations[2]: "insert into ... values (...)"
operations[3]: "insert into ... values (...)"

But the system underneath which executes the individual statements cannot guarantee the order of queued individual statements.
So my idea is to queue one operation which contains the combined individual statements statements.

operations[0]: "delete from ... where foreign_id = ...; insert into ... values (...); insert into ... values (...); insert into ... values (...); insert into ... values (...);"

Is there any support or recommended way to do this?

@Xzelsius
Copy link
Author

I can always just combine the individual statements like this:

PostgresCompiler compiler = new();

Query deleteStatement = new Query(...).AsDelete().Where(new { foreign_id = e.Id })
Query insertStatement = new Query(...).AsInsert(new { .... }) 

SqlResult deleteResult = compiler.Compile(deleteStatement);
SqlResult insertResult = compiler.Compile(insertStatement);

string sql = deleteResult.RawSql + ";" + insertResult.RawSql;
object[] parameters = deleteResult.Bindings.Concat(insertResult.Bindings).ToArray() 

But I am not sure if this is safe enough to do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant