是否有更清晰或更优雅的方法使用Entity Framework将多个参数传递给SQL存储过程?

时间:2015-07-17 21:17:32

标签: 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", dealer.DealerID).Value,
            new SqlParameter("@Name", dealer.Name),
            new SqlParameter("@Description", dealer.Description)
            ));
    }

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

1 个答案:

答案 0 :(得分:5)

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

  1. 我看不出如何将Dealer类型的对象转换为int
  2. 如果您的方法需要返回long,那么为什么要将存储过程的结果转换为int
  3. 您正在传递@DealerID参数,但它不是SP呼叫的一部分。
  4. 不确定为什么其中一个SqlParameter会调用.Value添加到其中。
  5. 所以,让我调整它,并假设你的出发点是这样的:

    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;
    }
    

    或者您可能决定SP直接返回long,如下所示:

    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
            );
    }
    

    ...您如何命名@Name@Description不再具有任何重要性,但您必须确保以正确的顺序传递参数值。

    除此之外,我不知道你可以把它变得更干净或更优雅。