小弟在从SQL 2008里面导出XML的跟踪日志,想用LINQ TO XML处理下,直接绑到.NET页面,看看是哪个语句的读取量最大:
1.<RootEvents>下面有2个不同内容的Event子元素
2.我想查询RootEvents子元素的name属性是"RPC:Completed"的Event元素集合,并且按照<Column id="16" name="Reads">5</Column>的Reads值排序
XML结构如下:<?xml version="1.0" encoding="utf-16"?>
<RootEvents>
<Event id="10" name="LogOut">
      <Column id="11" name="LoginName">sa</Column>
</Event>
 <Event id="10" name="RPC:Completed">
      <Column id="11" name="LoginName">sa</Column>
      <Column id="15" name="EndTime">2012-11-14T12:00:37.057+08:00</Column>
      <Column id="2" name="BinaryData">000000</Column>
      <Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
      <Column id="12" name="SPID">54</Column>
      <Column id="14" name="StartTime">2012-11-14T12:00:37.05+08:00</Column>
      <Column id="16" name="Reads">5</Column>
      <Column id="18" name="CPU">0</Column>
      <Column id="1" name="TextData">exec ProductGroup_SelectByTopAndCondition @Top=0,@Condition=N'v.ParentCode=''1402''',@OrderBy=N'v.Code'</Column>
      <Column id="9" name="ClientProcessID">1524</Column>
      <Column id="13" name="Duration">5037</Column>
      <Column id="17" name="Writes">0</Column>
    </Event>
  </RootEvents>---------------
下面是我自己写的恶心代码,求鞭策、求指点:protected void DBView()
    {
        string xmlPath = HttpContext.Current.Server.MapPath("~/App_Data/profile_1.xml");
        var xDoc = XDocument.Load(xmlPath);
        var rootObj = xDoc.Descendants("Events");
      
        
        var modelList = from a in rootObj
                        where a.Element("Event").Attribute("name").Value == "RPC:Completed"
                        orderby a.Element("Event").Attribute("Reads").Value descending
                        select new
                        {
                            Reads = a.Elements("Event").Elements("Column").Attribute("Reads").Value,
                            TextData = a.Elements("Event").Elements("Column").Attribute("TextData").Value
                        };
        
        GridView1.DataSource = modelList;
        GridView1.DataBind();    }----------------

解决方案 »

  1.   

    Linq ,有些时候用起来特别爽,比如查询数组很方便快捷,苦于对这个Linq研究得晚。
      

  2.   

    你的oderby 不对吧 orderby a.Element("Event").Attribute("Reads").Value descending
      

  3.   

    var xml=XDocument.Load("c:\\test.xml");
    var query=from x in xml.Descendants("Event") 
              where x.Attribute("name").Value=="RPC:Completed"
      let all= x.Elements("Column")
      orderby int.Parse(all.First(a=>a.Attribute("name").Value=="Reads").Value)  descending  
      select new
     {
     Reads = all.First(a=>a.Attribute("name").Value=="Reads").Value,                          
     TextData = all.First(a=>a.Attribute("name").Value=="TextData").Value
     };
      

  4.   

    如果NAME唯一的话,将代码中的First换成Single更好些
      

  5.   

    谢谢,一招见效。
    可是我不太明白这句用意何在:let all = x.Elements("Column")//这个let在这段语句中用处是什么,筛选条件吗?
      

  6.   

    你可以把all看成查询过程中的一个临时变量