如何从MVC调用存储过程,需要一个id列表

时间:2012-04-16 22:30:03

标签: c# asp.net-mvc stored-procedures

我对上一个问题的答案很好但实际上更复杂:

我需要向这个存储过程传递一个int列表:

ALTER proc [dbo].[Invoice_GetHomePageInvoices] (
      @AreaIdList varchar(max)
,      @FinancialYearStartDate datetime = null
,      @FinancialYearEndDate datetime = null

这是我到目前为止所拥有的:

public virtual IEnumerable<HomePageInvoice> GetHomePageInvoices(IList<Area> areas, FinancialYearLookup financialYear)
{
    var areaIds = areas.Select(x => x.Id).ToList();

    //return _db.Database.SqlQuery<HomePageInvoice>(string.Format("EXEC Invoice_GetHomePageInvoices @AreaIdList = '{0}', @FinancialYearStartDate = '{1}', @FinancialYearEndDate = '{2}'", areas.ToString(), financialYear.StartDate.ToString(), financialYear.EndDate.ToString()));

    var startDate = new SqlParameter("FinancialYearStartDate", financialYear.StartDate);
    var endDate = new SqlParameter("FinancialYearEndDate", financialYear.EndDate);

    return _db.Database.SqlQuery<HomePageInvoice>("Invoice_GetHomePageInvoices", startDate, endDate);
}

因此对datetime参数进行了排序。但是如果我当前有List<int>并且sql期望@AreaIdList varchar(max)

,你会如何将id发送到存储过程?

4 个答案:

答案 0 :(得分:2)

的string.join?

String.Join(",", areaIds)

答案 1 :(得分:1)

表值参数,你应该真正阅读下面的帖子。他在解释一切如何运作方面做得非常出色

http://www.sommarskog.se/arrays-in-sql-2008.html

答案 2 :(得分:0)

List<int>转换为以逗号分隔的字符串,并将其传递给存储过程。

Converting a generic list to a CSV string

答案 3 :(得分:0)

我真的取决于你对该列表的处理方式。但是,如果你将它用于IN子句或类似的东西,那么我将在C#中构建它并将其传递给proc:

StringBuilder s = new StringBuilder();
foreach (var i in areaIds)
{
    s.Append(String.Format("'{0}',", i));
}
s.TrimEnd(',');
var areas = new SqlParameter("AreaIdList", s.ToString());

然后在proc中你可以使用它:

WHERE area IN @AreaIdList