C# 带有EF Core FromSql的可选参数

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

是否可以使用EF Core FromSql来执行具有可选参数的存储过程

我一直在测试一个简单的场景,用作将旧EF6调用更新为EF核心调用的模板。我使用的测试示例作为概念证明:

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核心限制。