嵌套按字段值生成DataSet

时间:2010-09-22 12:29:55

标签: c# dataset

我在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>

我如何实现这一目标(除非通过自己迭代表并创建新表)?

感谢。

1 个答案:

答案 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);