你是在重複使用相同的對象,並且,你需要重新創建該對象。我喜歡在另一個功能分離代碼。這裏是我會怎麼做:
首先,你應該的getProducts像這樣:
public IList<Product> GetProducts(string sortexpression)
{
StringBuilder sql = new StringBuilder();
sql.Append(" SELECT ProductName, ProductID");
sql.Append(" FROM Products ");
if (!string.IsNullOrEmpty(sortExpression))
sql.Append(" ORDER BY " + sortExpression);
DataTable dt = Db.GetDataTable(sql.ToString());
return MakeProducts(dt);
}
所以你可能會問如何做Db.GetDataTable看,還有這樣的:
public static DataTable GetDataTable(string sql)
{
using (DbConnection connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
using (DbCommand command = factory.CreateCommand())
{
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = sql;
using (DbDataAdapter adapter = factory.CreateDataAdapter())
{
adapter.SelectCommand = command;
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
爲了簡化,我不使用sprocs,但你應該...無論如何,你可能會問MakeProducts(dt)是什麼樣的,這只是一個循環和添加到列表的函數:
private IList<Product> MakeProducts(DataTable dt)
{
IList<Product> list = new List<Product>();
foreach (DataRow row in dt.Rows)
list.Add(MakeProduct(row));
return list;
}
所以在這裏你只需循環每行和每做一個產品對象,它看起來是這樣的:
private Product MakeProduct(DataRow row)
{
int productId = int.Parse(row["ProductId"].ToString());
string name = row["ProductName"].ToString();
return new Product(productId, name);
}