我有一个“位置”课程。该类基本上保存地址,因此称为“位置”。我有一个数据表,返回多个我希望成为“位置”的记录。
现在,我在“location”类中有一个“加载”方法,它通过ID获取单个“位置”。但是,当我想要从多个数据表行中获取“位置”对象的集合时,我该怎么办?每一行都是“位置”。
出于显而易见的原因,我不想为每条记录访问数据库。我是否只是创建一个位置类的新实例,为属性赋值,同时绕过“load”方法循环遍历数据表中的行?这对我来说似乎合乎逻辑,但我不确定这是否是正确/最有效的方法。
答案 0 :(得分:2)
那就是(你的描述)几乎是如何将一行(或一组行)数据映射到C#biz对象。但是为了节省很多工作,您应该考虑一些现有的ORM(对象关系映射器)框架,例如NHibernate,Entity Framework,Castle ActiveRecord等。
大多数ORM实际上会生成所有样板代码,其中行和字段映射到.NET对象属性,反之亦然。 (是的,ORM允许您添加,更新和删除数据库数据,就像检索和映射数据库一样容易。)请给ORM看一看。少量的学习(每个学习曲线都有一些)将很快得到回报。在触及RDBMS的任何应用程序中,ORM也变得非常标准,并且确实是预期的。
此外,这些链接可能会引起关注(与ORM相关):
答案 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映射器可以为您节省大量时间!