Необязательные параметры с EF Core FromSql - PullRequest
0 голосов
/ 08 ноября 2018

Можно ли использовать EF Core FromSql для выполнения хранимой процедуры с необязательными параметрами?

Я тестировал простой сценарий для использования в качестве шаблона для обновления старых вызовов EF6 до вызовов EF Core. Тестовый пример, который я использую в качестве подтверждения концепции:

CREATE PROCEDURE [dbo].[TestNullableParameters] 
    @addressId int = null,
    @city nvarchar(100) = null,
    @createdByUserId int
AS
BEGIN
    select * from CRM..Address a
    where (@addressId is null or a.AddressId = @addressId)
    and (@city is null or a.City like @city)
    and a.CreatedByUserId = @createdByUserId
END

Мой тестовый код, который вызывает этот процесс:

[Test]
public void TestNullableParameters()
{
    var procName = "exec CRM..TestNullableParameters ";
    var context = _testContainer.Resolve<CRM2Context>();

    var addressId = new SqlParameter("@addressId", 182);
    var createdByUserId = new SqlParameter("@createdByUserId", 1620);
    var parameters = new[] {addressId, createdByUserId};
    var result = context.Address.FromSql(procName, parameters).ToList();
}

Этот код не работает, так как в нем говорится, что для процедуры требуется "@createdByUserId", который не был предоставлен - он пытается сопоставить созданныйByUserId с @city, а затем не имеет значения для сопоставления с @ madeByUserId.

Если я пытаюсь определить параметр @city со значением null, в нем говорится, что для процедуры @ city требуется ненулевое значение.

Если я пытаюсь явно добавить список параметров, используя только @addressId и @createdByUserId, он заявляет, что в нем отсутствует ненулевой @ city.

1 Ответ

0 голосов
/ 08 ноября 2018

Чтобы пропустить необязательные параметры, вы должны использовать синтаксис именованных параметров

@parameterName = parameterValue

как описано в Указание имен параметров в документации по SQL Server для выполнения хранимых процедур.

Как только вы это сделаете, вам больше не нужно иметь дело с DBNull и SqlParameter s - вы можете использовать перегрузку FromSql, принимающую интерполированную строку C #, и позволить EF Core создавать параметры для вас.

Таким образом, пример кода для вызова SP может быть уменьшен до:

var result = context.Address.FromSql(
    $"exec CRM.TestNullableParameters @addressId = {201}, @createdByUserId = {1620}")
   .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...