动态Linq查询

时间:2011-03-14 16:56:40

标签: vb.net dynamic linq-to-xml

我一直在尝试以下操作,但它会返回意外结果:

    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 q.@id = 1
    End If
    If haveSubSubelementId Then
        results = From q In results.<subsubelement> Where q.@id = 3
    End If

    results = results.Ancestors.<element>

上面的结果返回两个'element'节点但是它应该只返回第一个元素/子元素@id = 1 / subsubelement @ id = 3

但是如果结果。祖先。使用它返回正确的'子元素',如果不包含该行,则返回单个'subsubelement',这也是正确的我不明白为什么当mvoing到'element'时它返回两者(我发现它们都有一个子元素) id = 1,但我认为每个进一步的查询都会过滤掉前面的结果)任何人都有任何建议吗?

1 个答案:

答案 0 :(得分:1)

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

    Dim results = From q In xd...<element>
    If haveSubelementId Then
        results = From q In results.<subelement> Where q.@id = 1
    End If
    If haveSubSubelementId Then
        results = From q In results.<subsubelement> Where q.@id = 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

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