0

我的上一个问题得到了很好的答案,但实际上更复杂:

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

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

因此对日期时间参数进行了排序。List<int>但是,鉴于我当前有一个和 sql 期望,你将如何将 ids 发送到存储过程@AreaIdList varchar(max)

4

4 回答 4

2

字符串。加入?

String.Join(",", areaIds)
于 2012-04-16T22:32:24.040 回答
1

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

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

于 2012-04-16T22:53:37.910 回答
0

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

将通用列表转换为 CSV 字符串

于 2012-04-16T22:35:20.527 回答
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
于 2012-04-16T22:38:32.293 回答