EF Core FromSql的可选参数

时间:2018-11-08 18:05:18

标签: c# entity-framework-core ef-core-2.1

是否可以使用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

我的调用此proc的测试代码:

[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”,该代码未提供-尝试将createdByUserId映射到@city,然后没有值映射到@createdByUserId。

如果我尝试定义值为null的参数@city,则表明该过程要求@city为非空值。

如果我尝试仅使用@addressId和@createdByUserId显式添加参数列表,则表明它缺少不可空的@city。

1 个答案:

答案 0 :(得分:1)

为了跳过可选参数,您应该使用命名参数语法

@parameterName = parameterValue

如执行存储过程的SQL Server文档的Specifying Parameter Names部分所述。

一旦这样做,就完全不需要处理DBNullSqlParameter了-您可以使用FromSql重载接受C#插值字符串并让EF Core创建参数为了你。

因此,调用SP的示例代码可以简化为:

var result = context.Address.FromSql(
    $"exec CRM.TestNullableParameters @addressId = {201}, @createdByUserId = {1620}")
   .ToList();