1

在我们的应用程序中,我们正在考虑使用动态生成的类来保存我们的大量数据。这样做的原因是我们的客户的表具有不同的结构。因此,您可以有一个名为“DOG”的客户表(只是编造这个),其中包含“DOGID”、“DOGNAME”、“DOGTYPE”等列。客户 #2 可以具有与“列”相同的表“DOG” DOGID”、“DOG_FIRST_NAME”、“DOG_LAST_NAME”、“DOG_BREED”等。我们不能在编译时为这些创建类,因为客户可以随时更改表模式。

目前我的代码可以在运行时使用反射生成一个“DOG”类。我想弄清楚的是如何从 DataTable(或其他一些 .NET 机制)中填充此类,而不会造成极大的性能损失。我们有一张包含约 20 列和约 50k 行的表。对所有行和列执行 foreach 以创建集合大约需要 1 分钟,这有点太长了。

我是想提出一个过于复杂的解决方案,还是我走在正确的轨道上?有没有其他人遇到过这样的问题?创建动态类是微软开发人员提出的解决方案。如果我们可以填充这个集合并有效地使用它,我认为它可以工作。

4

3 回答 3

3

在 .NET 3.5 中,您尝试做的事情会变得相当复杂。您最好为模型中的数据创建一个带有 Dictionary<> 键/值对的类型。

如果您可以使用 .NET 4.0,则可以考虑使用 dynamic 和 ExpandoObjectdynamic关键字允许您创建对真正动态对象的引用 - ExpandoObject允许您轻松地动态添加属性和方法。所有这些都没有复杂的反射或代码生成逻辑。动态类型的好处是 DLR 对运行时绑定信息执行一些复杂的缓存,以允许类型比常规反射所允许的性能更高。

如果您需要做的只是将数据加载映射到现有类型,那么您应该考虑使用EntityFrameworkNHibernate之类的东西来为您的类型提供 ORM 行为。

为了处理数据加载性能,我建议您考虑完全绕过 DataTable 并将您的记录直接加载到您正在生成的类型中。我怀疑大多数性能问题都在于从它们原来所在的 DataTable 中读取和转换值。

于 2010-04-23T16:11:42.807 回答
1

您应该使用分析器来确定究竟需要什么时间,然后对其进行优化。如果在设置数据的时候使用反射,会很慢。通过缓存反射类型数据可以节省很多。

我很好奇,如果成员在编译时不知道,你将如何使用这些类?对于这种情况,也许您最好只使用一个普通的 DataTable ?

于 2010-04-23T16:09:47.080 回答
1

Check out PicoPoco and Massive. These are Micro ORMS. (light weight opensource ORM frameworks) that you use by simply copying in a single code file into your project.

Massive uses the ExpandoObject and does conversions from IDataRecord to the ExpandoObject wich I think is exactly what you want.

PicoPoco take an existing plain class and dynamically and efficiently generates a method (which it then caches by the way) to load it from a database.

于 2011-07-06T17:49:52.887 回答