在使用Silverlight之前,我们创建了自己的webService做为通用数据访问。开发者传递一个Sql语句,即可得到一个DataSet,DataTable作为返回值。在Silverlight项目中,由于其对DataTable的限制,我们不得不首先得到DataTable,而后在本地再创建Web service(WCF),对得到的DataTable进行转换。转换为数组或者泛型集合以适应Silverlight的需要。 但是这样做难免有些繁琐,且开发者做出了很多费力的工作。 这里,我们对原来的Webservice做出了一些改动:但凡返回值为DataSet的webMethod都为其加上一层“外衣”,将其转化为XElement后返回给调用者一个XML档案。开发者只需利用LINQ TO Xml通过简单的xml操作就可得到需要的集合。这样就免除了每个专案建立“自己”的service的工作。 下面通过一个简单的Demo对这个操作做出说明: 根据得到的DataTable,为其创建XElement作为返回值
Code
static void Main( string [] args) { // 获取数据源DataTable DataTable dt = client.ExecuteQuery(sql).Tables[ 0 ]; // 创建Xml Document XDocument doc = new XDocument( new XElement( " tables " , new XAttribute( " xmlns " , "" ), new XElement( " table " , new XAttribute( " name " , " 0 " ), new XElement( " columns " ), new XElement( " rows " ))) ); XElement columns = doc.Element( " tables " ).Element( " table " ).Element( " columns " ); foreach (DataColumn col in dt.Columns) { // 新增一个Element Column columns.Add( new XElement( " column " , new XAttribute( " name " , col.ColumnName), new XAttribute( " type " , col.DataType.Name) )); } XElement rows = doc.Element( " tables " ).Element( " table " ).Element( " rows " ); foreach (DataRow row in dt.Rows) { // 新增一个element Row XElement newrow = new XElement( " row " ); rows.Add(newrow); string data = null ; foreach (DataColumn col in dt.Columns) { switch (col.DataType.Name) { case " DateTime " : data = (row[col] == DBNull.Value ? "" : Convert.ToDateTime(row[col]).ToString( " yyyy/MM/dd HH:mm:ss " )); break ; default : data = (row[col] == DBNull.Value ? "" : row[col].ToString()); break ; } // 为新增的row添加Attribute newrow.Add( new XAttribute(col.ColumnName, data) ); } } XElement element = doc.Element( " tables " ); Console.WriteLine(element.ToString()); }
Result:调用者解析xelement
Code
public static List < BasicInfo > getBasicInfo(XElement element) { List < BasicInfo > Lists = new List < BasicInfo > (); // element为获得的返回者 var result = from item in element.Descendants( " row " ) select item; BasicInfo info = null ; foreach (XElement item in result) { info = new BasicInfo(); info.ID = ( int )item.Attribute( " ID " ); info.Name = ( string )item.Attribute( " NAME " ); info.ParentID = ( int )item.Attribute( " PARENTID " ); info.Grade = ( int )item.Attribute( " GRADE " ); info.IDX = ( int )item.Attribute( " IDX " ); Lists.Add(info); } return Lists; }
注:这里的实体类是不能缺少的
Code
public class BasicInfo { public int ID { set ; get ; } public string Name { set ; get ; } public int ParentID { set ; get ; } public int Grade { set ; get ; } public int IDX { set ; get ; } }
这里LINQ To XML的应用使得操作变得简单实用.