Для источников данных Asp.net: Список == плохо, Enumerable == хорошо.Оба могут быть использованы в качестве источника данных, но перечислимые, как правило, работают лучше, особенно для asp.net, где использование памяти так важно.Списки заставляют вас сохранить весь результат в памяти.Играйте в свои карты с перечисляемым количеством, и вам может понадобиться только одна запись в памяти за раз.
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
необходим статический метод Create()
, который принимает IDataRecord
и возвращает новый объект RetrieveActiveMuseumByMuseumID_Result
(это соответствует шаблону Factory).
Я склонен абстрагировать этот шаблон от «мини-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));
}