【问题标题】:Optional Parameters with EF Core FromSqlEF Core FromSql 的可选参数
【发布时间】:2018-11-08 18:05:18
【问题描述】:

是否可以使用 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”,但未提供 - 它尝试将 createdByUserId 映射到 @city,然后没有值映射到 @createdByUserId。

如果我尝试定义一个值为 null 的参数 @city,它表明该过程需要 @city 的非 null 值。

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

【问题讨论】:

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


    【解决方案1】:

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

    @parameterName = parameterValue
    

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

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

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

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

    【讨论】:

    • 如何使用它来包含输出 int 参数?在同样的场景中,除了proc也有一个输出参数,我尝试在sql字符串中传入@totalRows OUTPUT,并且我尝试将totalRows作为输出参数添加为SqlParamter对象。两种方法都不起作用
    • 我认为设置返回 SP (FromSql) 不能与输出参数结合使用。 Database.ExecuteSqlCommand 可以与输出参数一起使用,但只能与标量结果一起使用。 EF Core 限制。
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2021-11-14
    • 1970-01-01
    • 2023-03-24
    • 2020-07-28
    相关资源
    最近更新 更多