有没有更好的方法来做一个对象列表?

时间:2010-08-05 15:30:02

标签: c# asp.net

我正在尝试创建一个对象列表。还有更好的方法吗?

   // List
    public List<page> Select()
    {
      List<page> _list = new List<page>();
      string  SqlStatement = "select * from Pages";
      SqlConnection thisConnection = new SqlConnection(connStr);
      // Open the Connection
      thisConnection.Open();

      var thisCommand = thisConnection.CreateCommand();
      thisCommand.CommandText = SqlStatement;
      SqlDataReader thisReader = thisCommand.ExecuteReader();

      while (thisReader.Read())
      {
        // Create a new instance of the Current Page Object
        page currentPage = new page();
        // Fill the instance of the Current Page Object
        currentPage.PageID = Convert.ToInt32(thisReader["PageID"]);
        currentPage.ParentID = Convert.ToInt32(thisReader["ParentID"]);
        currentPage.CategoryID = Convert.ToInt32(thisReader["CategoryID"]);
        currentPage.Name = thisReader["Name"].ToString();
        currentPage.PageHTMLContent = thisReader["PageHTMLContent"].ToString();
        currentPage.NavigationText = thisReader["NavigationText"].ToString();
        currentPage.TopMenu = Convert.ToBoolean(thisReader["TopMenu"]);
        currentPage.SubMenu = Convert.ToBoolean(thisReader["SubMenu"]);
        currentPage.DisplayOrder = Convert.ToInt32(thisReader["DisplayOrder"]);
        currentPage.Active = Convert.ToBoolean(thisReader["Active"]);
        // Add the instance of the Current Page Object to the List<>.
        _list.Add(currentPage);
      }
      // Close the Database
      thisConnection.Close();
      return _list;      

    }

5 个答案:

答案 0 :(得分:3)

嗯,最简单的方法是使用某种ORM(NHibernate,EF等)。

如果你必须从数据库中提取它并自己映射,我要改变的主要内容是:

1)在using(){}块中包装SqlConnection和SqlCommand对象。
2)不要使用Select *,请调出您的特定列。
3)如果可以,请使用存储过程而不是内联sql语句。

答案 1 :(得分:3)

使用LINQ to Datasets可能会使您的代码更具可读性。您还应该确保在可能的情况下使用using语句包装对象:

public List<page> Select()
{
    var sqlStatement = "select * from pages";

    var sqlResults = new DataTable();

    using(SqlConnection conn = new SqlConnection(connStr))
    {
        using(SqlCommand command = new SqlCommand(sqlStatement, conn))
        {
            var adapter = new SqlDataAdapter(command);
            adapter.Fill(sqlResults);
        }
    }

    return sqlResults.AsEnumerable().Select(r => new page {
               PageID = r.Field<int>("PageID"),
               ParentID = f.Field<int>("ParentID"),
               CategoryID = r.Field<int>("CategoryID"),
               Name = r.Field<string>("Name"),
               PageHtmlContent = r.Field<string>("PageHTMLContent"),
               // Fill the rest of the properties
               Active = r.Field<bool>("Active")
           }).ToList();
}

答案 2 :(得分:1)

我看到这个earlier(Microsoft.Data.dll),仍然无法相信它会起作用。

var db = Database.OpenConnectionString(connString);
for(var row in db.Query("select * from Pages"))
{
   page currentPage = new page();
   currentPage.PageID  = row.PageID;
}

注意:我不认为这在企业设计中很聪明......但如果你想要快速和肮脏的东西......

我建议在这种情况下执行EF,并将表映射到实体。

答案 3 :(得分:1)

Automapper可能会有所帮助。我还没有使用它,但它似乎做了一些与此非常相似的事情。还有很多其他ORM解决方案可以将数据映射到对象。 NHibernate是一个受欢迎的。

答案 4 :(得分:-1)

查看所有属性名称如何与列名匹配,您可以遍历阅读器中的每一列并使用反射将其设置为页面相关属性?