0

以前の質問に対しては良い答えが得られましたが、実際にはさらに複雑です。

このストアド プロシージャに 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が期待している場合、ストアドプロシージャにIDをどのように送信しますか@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

your をコンマ区切りの文字列に変換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());

次に、プロシージャで次のように使用できます。

WHERE area IN @AreaIdList
于 2012-04-16T22:38:32.293 に答える