使用Linq中的Join重新排序

时间:2011-03-04 14:53:05

标签: c# xml linq

我希望我的XElements按文档顺序排列。 我可以在此示例中使用Join重新排序xpathGroups吗?

XDocument message_doc = XDocument.Load(message);

var xpathGroups =
    from e in contextErrors
    group e by SelectElement(message_doc, e.XPath) into g
    select new
    {
        Element = g.Key,
        ErrorItems = g,
    };

var documentOrderedGroups =
    from elem in message_doc.Root.DescendantsAndSelf()
    join e in xpathGroups on elem equals e.Element
    select e;

消息:

<root>
    <a>
        <aa>
            <aaa>9999</aaa>
        </aa>
        <aa>
            <aaa>8888</aaa>
        </aa>
    </a>
    <b>
        <bb>
            <bbb>7777</bbb>
        </bb>
    </b>
    <c>
        <cc>
            <ccc>6666</ccc>
        </cc>
    </c>
</root>

输入数据:

/root/c[1]/cc[1]/ccc[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/a[1]/aa[1]/aaa[1]

预期结果:

/root/a[1]/aa[1]/aaa[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/c[1]/cc[1]/ccc[1]

1 个答案:

答案 0 :(得分:1)

您的原始查询有效,结果是一个对象,其元素及其相关的XPath查询按文档顺序排列。但是,结果与您所做的注释冲突,您只想按文档顺序排列元素。

元素和XPath:如果你想要元素及其XPath,那么连接将作为查询的一部分保留,但我会用投影替换分组为匿名类型。

var xpathElements = contextErrors.Select(e => new
                    {
                        Element = message_doc.XPathSelectElement(e.XPath),
                        XPath = e.XPath
                    });
var ordered =  from e in message_doc.Descendants()
               join o in xpathElements on e equals o.Element
               select o;

仅限元素:如果您只希望元素按文档顺序排列,则以下方法也可以使用。

var xpathElements = contextErrors.Select(e => message_doc.XPathSelectElement(e.XPath));
var ordered = message_doc.Descendants()
                         .Where(e => xpathElements.Any(o => e == o));

在这两个例子中,我都用XPathSelectElement method取代了你的位置 我收集的SelectElement方法具有相同的目的。