Я хочу написать метод расширения для 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
Лучший метод для захвата/изменения SQL, созданного с помощью ExecuteUpdate в EF Core? ⇐ C#
Место общения программистов C#
1736367360
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;
Подробнее здесь: [url]https://stackoverflow.com/questions/79340638/best-method-for-capturing-modifying-sql-generated-by-executeupdate-in-ef-core[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия