DataTable的每一行作为一个类?

时间:2011-10-24 21:51:08

标签: c# .net class

我有一个“位置”课程。该类基本上保存地址,因此称为“位置”。我有一个数据表,返回多个我希望成为“位置”的记录。

现在,我在“location”类中有一个“加载”方法,它通过ID获取单个“位置”。但是,当我想要从多个数据表行中获取“位置”对象的集合时,我该怎么办?每一行都是“位置”。

出于显而易见的原因,我不想为每条记录访问数据库。我是否只是创建一个位置类的新实例,为属性赋值,同时绕过“load”方法循环遍历数据表中的行?这对我来说似乎合乎逻辑,但我不确定这是否是正确/最有效的方法。

3 个答案:

答案 0 :(得分:2)

那就是(你的描述)几乎是如何将一行(或一组行)数据映射到C#biz对象。但是为了节省很多工作,您应该考虑一些现有的ORM(对象关系映射器)框架,例如NHibernateEntity FrameworkCastle ActiveRecord等。

大多数ORM实际上会生成所有样板代码,其中行和字段映射到.NET对象属性,反之亦然。 (是的,ORM允许您添加,更新和删除数据库数据,就像检索和映射数据库一样容易。)请给ORM看一看。少量的学习(每个学习曲线都有一些)将很快得到回报。在触及RDBMS的任何应用程序中,ORM也变得非常标准,并且确实是预期的。

此外,这些链接可能会引起关注(与ORM相关):

Wikipedia article on ORMs

SO Discussion on different ORMs

Many different .NET ORMs listed

答案 1 :(得分:1)

您走在正确的轨道上,只需一次性访问数据库,就可以获得所需的所有位置。

要使代码更清晰/更短,请为Location类创建一个带DataRow的构造函数,然后相应地设置属性。通过这样做,您可以在代码库中的一个位置集中从列到属性的映射,这将易于维护。

然后,遍历数据表中的行并调用构造函数是完全可以接受的。

您也可以使用object to relational mapper,例如Entity Framework来进行数据库互动。

答案 2 :(得分:1)

创建一个返回IEnumerable的方法。在这个方法中做你的数据库的东西,我经常将sqldatareader传递给位置构造函数。所以我会有这样的东西

public static IEnumerable<location> GetLocations()
{
   List<location> retval = new List<location>();
   using(sqlconnection conn = new sqlconn(connection string here);
   {
      sqlcommand command = new sqlcommand(conn, "spLoadData");
      command.commandtype=stored proc
      SqlDataReader reader = command.executereader();
      while(reader.read())
      {
          retval.add(new location(reader));
      }
   }
   return retval;
}
很明显,代码不起作用,但只是为了给你一个想法。

如果您还有很多事情要做,ORM映射器可以为您节省大量时间!