При использовании лямбда-выражений с API-интерфейсами массового обновления для EF Core лямбда-выражение оценивается в паC#

Место общения программистов C#
Ответить
Anonymous
 При использовании лямбда-выражений с API-интерфейсами массового обновления для EF Core лямбда-выражение оценивается в па

Сообщение Anonymous »

Я использую API-интерфейсы массового обновления, входящие в состав EF Core, такие как функции ExecuteUpdateAsync(), для выполнения обновлений и передаю лямбда-выражение для моего valueExpression. Мне интересно, происходит ли оценка лямбда-выражения в памяти или на стороне БД?
В моем коде вызывается функция ExecuteUpdateAsync() следующим образом, а переменная dto является входным параметром во время вызова функции.

Код: Выделить всё

public async Task MyFunc(CustomType dto)
{
// some existing code...
if (await Data.MyTable
.Where(e => e.id == dto.id)
.ExecuteUpdateAsync(e => e
.SetProperty(p => p.Value, p => dto.Value ?? p.Value)) != 1)
throw;
// some existing code...
}
Для всего нижеприведенного предположим, что dto.Value не равно нулю (если оно было null, вместо передачи @__dto_Value_1 оно напрямую оценивается как null)

Я пытался просмотреть сгенерированную команду SQL, но похоже, что valueExpression оценивается перед генерацией SQL, что приводит к команде UPDATE нет вызова оператора COALESCE() (т. е. что-то вроде UPDATE "MyTable" SET "Value" = WHERE MyTable.Id" == @__dto_Id_1).
Если бы я вместо этого передал что-то следующим образом в вызове функции SetProperty():

Код: Выделить всё

public async Task MyFunc(CustomType dto)
{
// some existing code...
if (await Data.MyTable
.Where(e => e.id == dto.id)
.ExecuteUpdateAsync(e => e
.SetProperty(p => p.Value, p => p.Value ?? dto.Value)) != 1)
throw;
// some existing code...
}
Сгенерированный оператор SQL соответствует формату,

Код: Выделить всё

UPDATE "MyTable"
SET "Value" = COALESCE(MyTable."Value", @__dto_Value_1
WHERE MyTable."Id" == @__dto_Id_1
Означает ли это, что если левая часть проверки объединения значений NULL присутствует в памяти C#, оценка выполняется в памяти, но если она зависит от значений на стороне БД, она будет использовать оператор COALESCE() и передавать проверки NULL в БД?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-lambda-e
Ответить

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

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

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

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

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