C# 带有EF Core FromSql的可选参数
是否可以使用EF Core FromSql来执行具有可选参数的存储过程 我一直在测试一个简单的场景,用作将旧EF6调用更新为EF核心调用的模板。我使用的测试示例作为概念证明:C# 带有EF Core FromSql的可选参数,c#,entity-framework-core,ef-core-2.1,C#,Entity Framework Core,Ef Core 2.1,是否可以使用EF Core FromSql来执行具有可选参数的存储过程 我一直在测试一个简单的场景,用作将旧EF6调用更新为EF核心调用的模板。我使用的测试示例作为概念证明: CREATE PROCEDURE [dbo].[TestNullableParameters] @addressId int = null, @city nvarchar(100) = null, @createdByUserId int AS BEGIN select * from CR
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();
}
[测试]
public void TestNullableParameters()
{
var procName=“exec CRM..TestNullableParameters”;
var context=_testContainer.Resolve();
var addressId=新的SqlParameter(“@addressId”,182);
var createdByUserId=newsqlparameter(@createdByUserId),1620;
var参数=new[]{addressId,createdByUserId};
var result=context.Address.FromSql(procName,parameters.ToList();
}
此代码不起作用,因为它声明过程需要“@createdByUserId”,但未提供该值——它尝试将createdByUserId映射到@city,然后没有值映射到@createdByUserId
如果我试图用null值定义参数@city,它表示该过程需要@city的非null值
如果我尝试显式添加一个仅包含@addressId和@createdByUserId的参数列表,它会声明它缺少不可为空的@city。为了跳过可选参数,应该使用命名参数语法
@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();
我如何使用它来包含输出int参数?在相同的场景中,除了proc还有一个OUTPUT参数外,我尝试在sql字符串中传入@totalRows OUTPUT,并尝试将totalRows作为输出参数添加为sqlparameter对象。两个方法都没有workedI思想集,返回的SP(
FromSql
)不能与输出参数组合<代码>数据库。ExecuteSqlCommand可以与输出参数一起使用,但只能与标量结果一起使用。EF核心限制。