Динамический запрос Linq - PullRequest
1 голос
/ 14 марта 2011

Я пробовал следующее, но он возвращает неожиданные результаты:

    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', однако он должен возвращать только первый, где element / subelement @ id = 1 / subsubelement @ id = 3

Однако, если результаты. Предки. используется, он возвращает правильный «субэлемент», и если эта строка не включена, он возвращает один «субэлемент», который также является правильным. Я не понимаю, почему при mvoing «элементу» он возвращает оба (я понимаю, что оба имеют субэлемент с id = 1, но я думал, что каждый последующий запрос отфильтрует предполагаемые результаты) у кого-нибудь есть предложения?

1 Ответ

1 голос
/ 14 марта 2011

Единственный способ заставить его работать должным образом - выполнить следующее:

    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

Но это выглядит немного неуклюже, и я надеялся, что можно будет вернуть правильную коллекцию элементов изпоисковый запрос.

...