2009-08-07 77 views
1

我有一系列的对象,我创建:.NET对象设计

项目

订购

每个对象都有属性的合理数量,并且我使用了一个datareader来传递它“SELECT * FROM .objectname”。然后我填充一个对象集合,并返回集合。这工作如下:GetOrdersCollection(),GetSongsCollection()等

我明白SELECT *是一个性能问题,此外,有时我更喜欢在选择语句中包含额外的列中不存在的对象,并让所有人都返回。

所以我的问题是,解决这个问题的最好方法是什么?

  1. 我应该为每个查询类型创建一个新对象吗?

  2. 我试着在存储它之前检查列是否在datareader中,但是这会显示perf。的问题。有没有一个可以忽略的表演。避免IndexOutOfRange的方法?

  3. 我应该只使用Datatable并从表中读取权限吗?

回答

2

我明白SELECT *是一个 性能问题,

如果有只有几列这不是一个性能问题,或者你需要的所有列的反正。

1.我应该为每个查询类型创建一个新的对象吗?

您应该为每个表创建一个新对象,并为每个查询类型创建一个新方法。

2。我试着在存储 之前检查一下列是否在数据读取器中,但是这提供了性能。的问题。是 有一个可以忽略不计的表演。避免 IndexOutOfRange?

如果您是通过名称而不是索引引用您的字段,则不应该有任何IndexOutOfRange问​​题。如果您通过索引引用您的字段,则可以将它们循环到索引小于Count()列的位置,并且不应该有任何IndexOutOfRange问​​题。

3.我应该使用Datatable并从表中读取数据吗?

这是一个非常好的方法开始。考虑花一些时间来学习其他人建议的简单ORM。亚音速是一个很好的“第一”ORM。

1

从像DataReader这样只有前向的数据结构中进行性能读取会为您提供最佳的性能和资源节约。

另一方面,填充对象(如OR/M所做的)可以忽略不计,只要您返回的对象数不过多。

您的第一步应该是配置您的数据库并确保您有适当的索引。写一些测试,看看你最大的时间花费在哪里,并优化你最需要的目标区域。

+0

从数据库返回的数据速度对我来说不是问题。我可以在不到一秒的时间内返回20,000条记录。我的关注来自于尝试加载只包含某些查询所需的连接数据的对象。如果我包含来自另一个相关列的某列,这会打破对象设计。我知道这是一个耦合问题,但我不知道比使用数据表更好的方法。 – 2009-08-07 02:49:54

+0

p.s.我投了你的建议......谢谢。 – 2009-08-07 02:50:54

+0

这就是为什么OR/Ms被发明的原因 - 正如你所发现的,对象不一定映射1到1到数据库表(我们认为你最好的选择是找到一个性能和可​​维护性的快乐媒介 - 不要担心如何让您的应用程序企业能够让您的应用程序保持可持续性。那有意义吗? – 2009-08-07 02:55:03

1

是否有任何理由不能使用简单的ORM生成器,如SubSonic?这将允许您非常轻松地访问这些类型的集合,并且它们将被强制键入。由于查询将由SubSonic构建,因此您也不必担心SQL。

+0

我正在处理一个已经生成类文件的项目,我不确定我的声音会被听到迁移到像LINQ或SubSonic这样的OR/M。我们目前使用的东西效果很好,我只是寻找一种优雅的方式来将相关数据或部分数据包含在我的对象集合中。 – 2009-08-07 02:52:28

+0

就像OR/M成为讨论话题一样。如果你有很多多对多的关系,不要花太多时间投资Linq2Sql作为OR/M。 L2S不直接支持这些。 – 2009-08-07 02:57:17