2013-04-09 50 views
0

我正在查詢IEnumerable以便根據下層元素中的屬性對其進行過濾。我不知道元素名稱,但知道要查詢的屬性。查詢包含未知元素的IEnumerable <XObject>

給出更多細節。

此SearchVars類將在表單上包含選定的搜索選項。它還包含ObjectType屬性,該屬性是XML對象在文件中的標識符。對於下面的XML示例對象類型是T1

class SearchVars 
    { 
     public string ObjectType { get; set; } 
     public string ClientId { get; set; } 
     public string CustRef { get; set; } 
    } 

一個示例XML提取

<root> 
<T1> 
    <FT ClientID="PCL1" /> 
    <T2 CustRef="Cust1"> 
     <T3 Name="Site1"> 
      <TER Error="123" ErrorText="Error 123" /> 
      <TER Error="234" ErrorText="Error 234" /> 
      <T4 SubErr="50420208"> 
       <TSER ID="2199991741074" CHN="1"> 
        <TER Error="567" ErrorText="Error 567" /> 
       </TSER> 
      </T4> 
     </T3> 
    </T2> 
</T1> 
<T1> 
    <FT ClientID="PCL1" /> 
    <T2 CustRef="Cust2"> 
     <T3 Name="Site2"> 
      <TER Error="123" ErrorText="Error 123" /> 
      <TER Error="234" ErrorText="Error 234" /> 
     </T3> 
    </T2> 
</T1> 
</root> 

我會試圖尋找基於客戶端ID的和CustRef的錯誤屬性。在搜索方法中,我的初始代碼是將所有T1拉入可枚舉。 2個空的IF是我將用LINQ查詢過濾搜索變量上的數據的位置。因此,如果ClientID是PCL1,請過濾存在該客戶端ID屬性值的T1。

  public static IEnumerable<XObject> PerformSearch(string xmlData, Models.SearchVars vars) 
     { 
      XDocument document = XDocument.Parse(xmlData); 
      IEnumerable<XObject> result = document.Descendants(vars.ObjectType); 

      if (! string.IsNullOrEmpty(vars.ClientId)) 
      { 


      } 

      if (!string.IsNullOrEmpty(vars.CustRef)) 
      { 

      } 

      return result; 
     } 

我希望我在嘗試是明確的,期待今天有些學習。 謝謝

回答

0

這不是一個乾淨的解決方案,因爲我想,但它的工作原理。非常開放更好的想法!

class Search 
{ 
    public static IEnumerable<XObject> PerformSearch(string xmlData, Models.SearchVars vars) 
    { 
     XDocument document = XDocument.Parse(xmlData); 
     IEnumerable<XObject> result = document.Descendants(vars.ObjectType); 

     if (! string.IsNullOrEmpty(vars.ClientId)) 
     { 
      result = from i in result 
        where i.ToString().Contains(string.Format("ClientId={0}",vars.ClientId)) 
        select i; 
     } 

     if (!string.IsNullOrEmpty(vars.CustRef)) 
     { 
      result = from i in result 
        where i.ToString().Contains(string.Format("CustRef={0}", vars.CustRef)) 
        select i; 
     } 

     return result; 
    } 
}