Asp.netデータソースの場合:List == bad、Enumerable == good。どちらもデータソースとして使用できますが、特にメモリ使用が非常に重要なasp.netの場合、列挙型の方がパフォーマンスが向上する傾向があります。リストは、結果セット全体をメモリに保存するよう強制します。あなたのカードを列挙可能なものと一緒にプレイしてください。一度に1つのレコードしかメモリに保存する必要はありません。
public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
using (var cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MuseumDB"].ConnectionString))
using (var cmd = new SqlCommand("StoredProcedureName", cn)
{
cmd.CommandType = CommandTypes.StoredProcedure;
//you need to supply some of the information for this line: you didn't include it in your question
cmd.Parameters.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;
cn.Open();
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{ //you'll need to implement the static create method I used here
yield return new RetrieveActiveMuseumByMuseumID_Result.Create(rdr);
}
}
}
}
この作品を作るために、あなたのRetrieveActiveMuseumByMuseumID_Result
タイプはIDataRecord
を受け入れ、(これはFactoryパターンを次の)新しいRetrieveActiveMuseumByMuseumID_Result
オブジェクトを返す静的Create()
方法を必要とします。
私はこのようになり、一般的な方法で使用して、このパターン離れた「ミニORM」と抽象的に傾向がある:
public static IEnumerable<IDataRecord> GetData(string command, Action<SqlParameterCollection> addParameters)
{
using (var cn = new SqlConnection(/* generic code for connection string here */));
using (var cmd = new SqlCommand(command, cn))
{
addParameters(cmd.Parameters);
cn.Open();
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return rdr;
}
}
}
}
をそして私はこのようなクエリのためにそれを呼び出します。
public static IEnumerable<RetrieveActiveMuseumByMuseumID_Result> GetActiveMuseum()
{
return GetData("exec StoredProcedureName @ParameterName", p =>
{
p.Add("@ParameterName", SqlDbTypes.???).Value = ParameterValue;
}).Select(r => RetrieveActiveMuseumByMuseumID_Result.Create(r));
}
投稿されたコードのどの部分をストアドプロシージャで処理する予定ですか? –
ストアドプロシージャを実行するためのインフラストラクチャをセットアップしました( 'new MuseumDB(...')をインストールした後、空のリストを作成して返します)実際にSPを実行するコードを追加する必要があります。 – phoog