我对上一个问题的答案很好但实际上更复杂:
我需要向这个存储过程传递一个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)
答案 0 :(得分:2)
的string.join?
String.Join(",", areaIds)
答案 1 :(得分:1)
表值参数,你应该真正阅读下面的帖子。他在解释一切如何运作方面做得非常出色
答案 2 :(得分:0)
将List<int>
转换为以逗号分隔的字符串,并将其传递给存储过程。
答案 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