Лучший метод для захвата/изменения SQL, созданного с помощью ExecuteUpdate в EF Core?C#

Место общения программистов C#
Ответить
Anonymous
 Лучший метод для захвата/изменения SQL, созданного с помощью ExecuteUpdate в EF Core?

Сообщение Anonymous »

Я хочу написать метод расширения для EF Core 9, который будет вызывать ExecuteUpdate и возвращать измененные строки как IQueryable, а не измененное количество строк.
Я добился этого, пометив запрос ExecuteUpdate уникальным идентификатором, а затем зафиксировав SQL и параметры с помощью DBCommandInterceptor. Затем SQL передается обратно вызывающему методу, модифицируется и включает RETURNING * (SQLite) или OUTPUT INSERTED * (SQL Server) и выполняется с использованием FromSqlRaw.Это работает, но есть ли лучший способ перехвата SQL для ExecuteUpdate? (ToQueryString() нельзя использовать с методом ExecuteUpdate) или с использованием деревьев выражений? (Я использую регулярное выражение, чтобы разделить запрос и вставить предложение OUTPUT INSERTED * в SQL Server).
// Create the Unique query Id and insert it as a tag into the source query.
// Source is IQueryable containing the where clause etc.
Guid updateId = Guid.NewGuid();
source = InsertUpdateId(source, updateId);

// Execute the update, this stores the sql and parameters.
// It does not execute the SQL but returns a dummy value instead.
int dummyUpdateResult = source.ExecuteUpdate(builder.GenerateLambda());

if (dummyUpdateResult != DummyUpdateResult)
{
throw new InvalidOperationException("Unable to obtain query parameters");
}

// Get the parameters back from the interceptor.
(string sql, object[] parameters) = GetUpdateParameters(updateId);

// Add a OUTPUT INSERTED * / RETURNING * to the query.
DbContext context = source.GetContext();
sql = AddOutputClauseToSql(context, sql);

// Execute the query and return the results.
IQueryable updateResult = context.Set()
.FromSqlRaw(sql, parameters)
.AsNoTracking();

return updateResult;


Подробнее здесь: https://stackoverflow.com/questions/793 ... in-ef-core
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»