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

Chr*_*ris 5 c# asp.net stored-procedures entity-framework

现在我将多个参数传递给具有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)
            ));
    }
Run Code Online (Sandbox Code Playgroud)

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

sst*_*tan 5

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

  1. 我看不出你如何将类型的对象转换Dealerint.
  2. 如果你的方法预计会返回a long,那么为什么要将存储过程的结果转换为int
  3. 您正在传递@DealerID参数,但它不是SP调用的一部分.
  4. 不知道为什么其中一个SqlParameters有调用.Value添加到它上面.

所以,让我调整它,并假设你的出发点是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

或者你可能决定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)
        );
}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我看到的唯一简化是你可以改变调用,SqlQuery以便使用位置参数而不是命名参数.进行此更改允许您放弃显式SqlParameter实例的创建.然后可以将呼叫简化为:

public long AddDealer(Dealer dealer)
{
    return AWJE.Database.SqlQuery<long>(
        "usp_InsertDealer @Name, @Description",
        dealer.Name,
        dealer.Description
        );
}
Run Code Online (Sandbox Code Playgroud)

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

除此之外,我不知道你可以使这个更干净或更优雅.