2011-03-14 96 views
1

我一直在尝试以下,但它返回意外的结果:动态LINQ查询

Dim xd As XDocument = _ 
    <?xml version="1.0" encoding="utf-8"?> 
    <root> 
     <element> 
      <subelement id="1"> 
       <subsubelement id="1"/> 
       <subsubelement id="3"/> 
       <subsubelement id="1"/> 
      </subelement> 
      <subelement id="2"/> 
      <subelement id="3"/> 
     </element> 
     <element> 
      <subelement id="4"/> 
      <subelement id="3"/> 
      <subelement id="2"> 
       <subsubelement id="1"/> 
       <subsubelement id="1"/> 
       <subsubelement id="3"/> 
      </subelement> 
      <subelement id="5"/> 
     </element> 
    </root> 

    Dim haveSubelementId As Boolean = True 
    Dim haveSubSubelementId As Boolean = True 

    Dim results = From q In xd...<element> 
    If haveSubelementId Then 
     results = From q In results.<subelement> Where [email protected] = 1 
    End If 
    If haveSubSubelementId Then 
     results = From q In results.<subsubelement> Where [email protected] = 3 
    End If 

    results = results.Ancestors.<element> 

上述结果同时返回“元素”节点但是它应该只返回第一个where元素/子元素@ ID = 1/subsubelement @ id = 3

但是,如果results.Ancestors。被使用它返回正确的'子元素',如果该行不包含它返回一个'subsubelement'这也是正确的我不明白为什么当mvoing到'元素'它返回两个(我意识到两者都有一个子元素与id = 1,但我认为每个进一步的查询将过滤出以前的结果)任何人有任何建议?

回答

1

我可以让它正常工作的唯一方法是通过执行以下操作:

Dim results = From q In xd...<element> 
    If haveSubelementId Then 
     results = From q In results.<subelement> Where [email protected] = 1 
    End If 
    If haveSubSubelementId Then 
     results = From q In results.<subsubelement> Where [email protected] = 3 
    End If 

    For Each xe As XElement In results 
     If haveSubSubelementId Then 
      xe = xe.Parent.Parent 
     If haveSubelementId Then 
      xe = xe.Parent 
     End If 
     Console.WriteLine(xe.ToString) 
    Next 

但它看起来有点笨拙,我曾希望,这将有可能从返回正确的元素集合搜索查询。