C# 使用实体框架向SQL存储过程传递多个参数是否有更干净或优雅的方法?

C# 使用实体框架向SQL存储过程传递多个参数是否有更干净或优雅的方法?,c#,asp.net,entity-framework,stored-procedures,C#,Asp.net,Entity Framework,Stored Procedures,现在,我正在使用Entity Framework将多个参数传递给一个存储过程,如下所示 public long AddDealer(Dealer dealer) { return Convert.ToInt32(AWJE.Database.SqlQuery<Dealer>( "usp_InsertDealer @Name, @Description", new SqlParameter("@DealerID",

现在,我正在使用Entity Framework将多个参数传递给一个存储过程,如下所示

public long AddDealer(Dealer dealer)
    {
        return Convert.ToInt32(AWJE.Database.SqlQuery<Dealer>(
            "usp_InsertDealer @Name, @Description",
            new SqlParameter("@DealerID", dealer.DealerID).Value,
            new SqlParameter("@Name", dealer.Name),
            new SqlParameter("@Description", dealer.Description)
            ));
    }
public long add经销商(经销商)
{
返回Convert.ToInt32(AWJE.Database.SqlQuery(
“usp_InsertDealer@Name,@Description”,
新的SqlParameter(“@DealerID”,dealer.DealerID).Value,
新的SqlParameter(“@Name”,dealer.Name),
新的SqlParameter(“@Description”,dealer.Description)
));
}

是否有一种更优雅或更干净的方式来传递多个参数,而不是显示的方式?如果我遇到其他需要传递更多参数的存储过程,那么这种方式看起来很快就会变得一团糟。

您的代码示例显然不是一个有效的示例:

  • 我不明白如何将
    Dealer
    类型的对象转换为
    int
  • 如果希望您的方法返回
    long
    ,那么为什么要将存储过程的结果转换为
    int
  • 您正在传递一个
    @DealerID
    参数,但它不是SP调用的一部分
  • 不确定为什么有一个
    SqlParameter
    s调用了
    .Value
    add
  • 让我调整一下,假设你的起点是这样的:

    public long AddDealer(Dealer dealer)
    {
        return AWJE.Database.SqlQuery<Dealer>(
            "usp_InsertDealer @Name, @Description",
            new SqlParameter("@Name", dealer.Name),
            new SqlParameter("@Description", dealer.Description)
            ).DealerID;
    }
    
    public long AddDealer(Dealer dealer)
    {
        return AWJE.Database.SqlQuery<long>(
            "usp_InsertDealer @Name, @Description",
            new SqlParameter("@Name", dealer.Name),
            new SqlParameter("@Description", dealer.Description)
            );
    }
    
    无论哪种方式,我看到的唯一简化是,您可以将调用更改为
    SqlQuery
    ,以便使用位置参数而不是命名参数。进行该更改允许您放弃显式
    SqlParameter
    实例的创建。然后可以将呼叫简化为:

    public long AddDealer(Dealer dealer)
    {
        return AWJE.Database.SqlQuery<long>(
            "usp_InsertDealer @Name, @Description",
            dealer.Name,
            dealer.Description
            );
    }
    
    public long add经销商(经销商)
    {
    返回AWJE.Database.SqlQuery(
    “usp_InsertDealer@Name,@Description”,
    经销商名称,
    经销商,描述
    );
    }
    
    。。。其中,如何命名
    @name
    @Description
    不再重要,但必须确保以正确的顺序传递参数值


    除此之外,我不知道您是否可以使它更干净或更优雅。

    您是先使用代码还是生成了edmx?我知道在过去,我在edmx中添加了一个存储过程,然后能够像调用函数一样调用它@kmacdonald,我在SSMS中编写了存储过程和表,然后从数据库中生成。我不知道
    usp\u InsertAddress
    到底做了什么,但在我看来,您可以只使用一个实体,然后将其添加到上下文和
    SaveChanges()
    中,或者,如果需要使用存储过程进行CUD操作,相应地映射存储的进程。EF还将尝试将存储过程的结果具体化为
    IEnumerable
    ,因此我不太确定
    Convert.ToInt32()
    在这里应该如何工作。@Pawel,我注意到我写的东西有一个缺陷。我还不能测试任何东西,因为我还有很多方法要写。usp_InsertAddress是一个crud操作并返回新的ID,这就是为什么我让它将返回值转换为Int32,这是错误的,这将是我的下一个问题,因为我改变了方法。我要做的是用更新的版本来编辑这个方法,更新后的版本是关于如何获取返回的ID的。谢谢你澄清了问题,你是对的,这不是一个有效的例子,因为我没有机会测试,因为我还有很多东西要写,并且要测试后者,所以我很感激这个修复。那么前两个代码块中的任何一个都会给我存储过程返回的ID?仅仅是能够删除命名参数和使用位置参数,就可以更彻底地清理它。