我在DataRelation
中使用DataSet
to nest tables来获取这样的XML结果:
<Customer>
<Name>John</Name>
<Age>30</Age>
<Sex>Male</Sex>
<Order>
<Id>123</Id>
<Price>200.00</Price>
</Order>
</Customer>
我想通过字段值(如性别)对数据进行分组,以获得如下结果:
<Male>
<Customer>
<Name>John</Name>
<Age>30</Age>
<Order>
<Id>123</Id>
<Price>200.00</Price>
</Order>
</Customer>
</Male>
我如何实现这一目标(除非通过自己迭代表并创建新表)?
感谢。
答案 0 :(得分:1)
如果您正在寻找XML输出,可以使用Linq-to-XML来获得结果。第一步是从DataSet生成XML。我想它看起来像这样:
<Customers>
<Customer>
<Name>John</Name>
<Age>30</Age>
<Sex>Male</Sex>
<Order>
<Id>123</Id>
<Price>200.00</Price>
</Order>
</Customer>
<Customer>
<Name>Jane</Name>
<Age>28</Age>
<Sex>Female</Sex>
<Order>
<Id>124</Id>
<Price>100.00</Price>
</Order>
</Customer>
<Customer>
<Name>Jill</Name>
<Age>37</Age>
<Sex>Female</Sex>
<Order>
<Id>125</Id>
<Price>350.00</Price>
</Order>
</Customer>
<Customer>
<Name>Jack</Name>
<Age>34</Age>
<Sex>Male</Sex>
<Order>
<Id>126</Id>
<Price>475.00</Price>
</Order>
</Customer>
</Customers>
将该XML加载到XDocument中,然后您可以使用LINQ执行分组并使用该结果。
XDocument document = XDocument.Parse(xml);
var query = from customer in document.Root.Elements("Customer")
group customer by customer.Element("Sex").Value into sexgroup
select new XElement(sexgroup.Key,
from cust in sexgroup
select new XElement("Customer",
cust.Element("Name"),
cust.Element("Age"),
cust.Element("Order")));
XDocument changedOutput = new XDocument();
changedOutput.Add(new XElement("GroupedCustomers", query));
新的XDocument现在拥有以下结构:
<GroupedCustomers>
<Male>
<Customer>
<Name>John</Name>
<Age>30</Age>
<Order>
<Id>123</Id>
<Price>200.00</Price>
</Order>
</Customer>
<Customer>
<Name>Jack</Name>
<Age>34</Age>
<Order>
<Id>126</Id>
<Price>475.00</Price>
</Order>
</Customer>
</Male>
<Female>
<Customer>
<Name>Jane</Name>
<Age>28</Age>
<Order>
<Id>124</Id>
<Price>100.00</Price>
</Order>
</Customer>
<Customer>
<Name>Jill</Name>
<Age>37</Age>
<Order>
<Id>125</Id>
<Price>350.00</Price>
</Order>
</Customer>
</Female>
</GroupedCustomers>
编辑根据不知道客户元素列表中的内容(名称和性别除外)的注释,您可以在查询中略微更改方法。这将根据给定的XML样本生成与上面相同的输出。
var query = from customer in document.Root.Elements("Customer")
group customer by customer.Element("Sex").Value into sexgroup
select new XElement(sexgroup.Key,
from cust in sexgroup
select new XElement("Customer",
cust.Elements().Where(ele => ele.Name.LocalName != "Sex")));
或者您只需选择整个cust
元素,该元素仍然包含Sex
标记,这可能会在您处理记录时对您更有意义。您仍然可以将它们分组,但您不会在客户级别丢失任何信息。
var query = from customer in document.Root.Elements("Customer")
group customer by customer.Element("Sex").Value into sexgroup
select new XElement(sexgroup.Key,
from cust in sexgroup
select cust);