gpt4 book ai didi

c# - EF Core FromSql 的可选参数

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:19 26 4
gpt4 key购买 nike

是否可以使用 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 的非空值。

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

最佳答案

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

@parameterName = parameterValue

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

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

这样调用SP的示例代码可以简化为:

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

关于c# - EF Core FromSql 的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53213667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com