在.NET中使用动态数量的属性创建数据模型的最佳方法

时间:2011-08-29 12:12:58

标签: .net c#-4.0 datamodel

我正在编写一个数据访问层,我只想返回每个请求所需的数据。假设您可以检索到总共100个属性,但正常请求可能只需要两个或三个。

所以我在请求中添加了一个参数,用于指定要返回的属性,并且只会从数据库中提取此数据。

正常请求将返回1,000 - 10,000行的列表。我现在最关心的是如何有效地回归它们。

数据将在我的.NET项目中“内部”使用,但也可能被序列化为XML和JSON,因此我不希望有98个空属性,而实际上只有2个属性是填充数据。

那么,用于创建此模型的最佳技术(在性能和“开销大小”的情况下)是什么?

更新 所以一个房产实际上可以有三个州。如果它从未被要求,它应该以某种方式被删除,如果它被要求它应该是null或实际值。

2 个答案:

答案 0 :(得分:3)

考虑使用DynamicDictionary(请参阅System.Dynamic.DynamicObject类文档中的“示例”部分)其中DynamicDictionary派生自DynamicObject类,具有获取/设置的能力运行时的属性。

它使用内部字典来存储属性及其值,因此您不会得到大量未使用的属性,访问时间也应该没问题。用法非常简单

    // Creating a dynamic dictionary.
    dynamic person = new DynamicDictionary();

    // Adding new dynamic properties. 
    // The TrySetMember method is called.
    person.FirstName = "Ellen";
    person.LastName = "Adams";

或者您可以开箱即用ExpandoObject,但它有点重,因为除了属性外,它还允许您在此处存储事件和代理实例。

使用XML / JSON进行序列化/反序列化不应成为问题。

答案 1 :(得分:3)

虽然我同意Andrei's answer很方便,但肯定会对性能产生影响。如果您的数据是平的(并且它是,因为您最终从数据库中提取),那么您可以IEnumerable<IDictionary<string, object>> IEnumerable<T>中的每一行都是IDictionary<string, object>包含值从排。

开始时比较笨拙,但 动态;从结果集中添加或删除属性仍然有效。

它也更高效,因为你不会(1,000 to 10,000) * N调用反射(1,000到10,000)行,时间N,每行的属性数(如果你有100个属性)每行,然后是对反射的100,000到1,000,000次调用,这将加起来)。 DynamicDictionary最终将键/值对存储在查找表中,但它使用Reflection(通过DLR优化,但仍然是它的核心)来到查找表。

知道属性是什么(你说你在内部为你的项目使用它,所以你 知道你想要使用的属性是什么)。为此,您确实应使用强类型data transfer object,其属性可以为空,代表数据库中的值;结果集中任何null或不存在的内容都将设置为null。结果集中不存在的值永远不会被设置。

这样,你没有反射,你得到编译时类型检查(非常重要,使用DynamicObject将导致运行时异常),以及更好的性能。

XML或JSON中的序列化对于这些方法中的任何一种都很简单,您只需序列化空值,或者根本不对该属性进行序列化(如果使用XML,只需确保您的模式支持元素作为选项)。