首页 / 软件开发 / Silverlight / Silverlight,WCF传递DataTable解决方案
Silverlight,WCF传递DataTable解决方案2011-04-13 博客园 Amar-YaoSilverlight与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/**//// <summary>
/// 字段信息
/// </summary>
[XCenter.Framework.Public.Serialization.Serializable,DataContract]
public class Field:XCenter.Framework.Public.Core.ICloneable,IMobileObject
{
public Field()
{
}
props#region props
private string dataType;
private string caption;
private string fieldName;
//private string note;
private string expression;
//private int precision;
//private int scale;
private int maxLength;
private bool isRequire;
private bool isKey;
private bool isReadOnly;
/**//// <summary>
/// 数据类型
/// </summary>
[DataMember]
public string DataType
{
get { return dataType; }
set { dataType = value; }
}
/**//// <summary>
/// 显示名称
/// </summary>
[DataMember]
public string Caption
{
get { return caption; }
set { caption = value; }
}
/**//// <summary>
/// 字段名称
/// </summary>
[DataMember]
public string FiledName
{
get { return fieldName; }
set { fieldName = value; }
}
/**//// <summary>
/// 表达式
/// </summary>
[DataMember]
public string Expression
{
get { return expression; }
set { expression = value; }
}
/**//// <summary>
/// 数据长度
/// </summary>
//[DataMember]
//public int Precision
//{
// get { return precision; }
// set { precision = value; }
//}
/**//// <summary>
/// 小数位数
/// </summary>
//[DataMember]
//public int Scale
//{
// get { return scale; }
// set { scale = value; }
//}
/**//// <summary>
/// 备注
/// </summary>
//[DataMember]
//public string Note
//{
// get { return note; }
// set { note = value; }
//}
/**//// <summary>
/// 最大长度
/// </summary>
[DataMember]
public int MaxLength
{
get { return maxLength; }
set { maxLength = value; }
}
/**//// <summary>
/// 是否可空
/// </summary>
[DataMember]
public bool IsRequire
{
get { return isRequire; }
set { isRequire = value; }
}
/**//// <summary>
/// 是否为主键
/// </summary>
[DataMember]
public bool IsKey
{
get { return isKey; }
set { isKey = value; }
}
/**//// <summary>
/// 是否只读
/// </summary>
[DataMember]
public bool IsReadOnly
{
get { return isReadOnly; }
set { isReadOnly = value; }
}
#endregion
public override string ToString()
{
return String.IsNullOrEmpty(caption) ? fieldName : caption;
}
public override bool Equals(object obj)
{
if (fieldName == null || obj == null || !(obj is Field))
return false;
Field f = (Field)obj;
return f.FiledName.Equals(fieldName);
}
public override int GetHashCode()
{
return fieldName.GetHashCode();
}