代码改变世界

Silverlight,WCF传递DataTable解决方案

2009-05-30 19:55  Amar-Yao  阅读(6192)  评论(29编辑  收藏  举报

      Silverlight与WCF(WebService)交互多以实体类的形式进行数据传递。但对于报表平台这样的形式不可取,

因为你不能预知客户在设计报表时选中了哪个数据库的哪些表的哪些字段。因此传统.Net中的DataTable是一种很好

的解决方案。下面讨论笔者的一种解决方案。欢迎各位拍砖。

      整个解决方案的思想就是将DataTable分为元数据(MetaData)、数据(Data)两部分进行传递。MetaData不用说就

是当前DataTable的列信息(例如列名,数据类型,最大长度等等)。至于数据,我们知道DataTable是一种二维结构。所以

我选择List<List<object>>的形式进行数据存储。这样的数据结构虽然效率不高但可扩展性比较强送到客户端后便于进一步

数据处理(例如:小记合计,动态列等)。MetaData,Data传递到客户端后客户端代码根据MetaData的信息用TypeBuilder等API

动态创建实体类,并转换为List<object>绑定到DataGrid。

      首先定义数据结构,这里我用DataSetData作为自定义的数据容器类。

      Field.cs 字段信息(对应DataTable中的列)

Field

 

MetaData.cs 元数据信息(Field的容器)

MetaData

  DataSetData.cs 数据集定义信息(元数据、数据的容器)

 

 

DataSetData

 

      以上是数据结构定义。还有两个核心转换方法DataTable 上的扩展方法GetData,该方法的主要作用是将DataTable的数据装入

DataSetData实例。

DataTable扩展方法

 

      上面的方法在Server端运行。下面的方法在Client端运行,主要作用就是将List<List<object>>类型的数据根据元数据信息

生成实体类并填充到List<object>中供UI控件绑定。

      

DataTableHelper
      

      不行了,代码贴太多了,速度太慢了,下一篇Blog再解释吧。(不知是cnblogs的问题还是遨游的问题)