我正在尝试创建一个对象列表。还有更好的方法吗?
// 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;
}
答案 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)
查看所有属性名称如何与列名匹配,您可以遍历阅读器中的每一列并使用反射将其设置为页面相关属性?