现在我将多个参数传递给具有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)
));
}
是否有更优雅或更清晰的方式来传递多个参数,而不是显示的方式?如果我遇到其他存储过程需要传递更多参数,那么这种方式看起来会很快变得混乱。
答案 0 :(得分:5)
您的代码示例显然不是一个有效的示例:
Dealer
类型的对象转换为int
。long
,那么为什么要将存储过程的结果转换为int
?@DealerID
参数,但它不是SP呼叫的一部分。SqlParameter
会调用.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;
}
或者您可能决定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
不再具有任何重要性,但您必须确保以正确的顺序传递参数值。
除此之外,我不知道你可以把它变得更干净或更优雅。