嵌套的linq查询

时间:2010-02-01 22:19:30

标签: linq

我正在使用像这样的xml文件。

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  <Body>
    <Element1>
      <Element2 day="2009-10-18">
        <Element3 name="Joe">
          <Element4 time="1">
            <Element5 amount="0" price="16.58"/>
            <Element5 amount="1" price="18.58"/>
            <Element5 amount="2" price="20.58"/>
          </Element4>
        </Element3>
        <Element3 name="Fred">
          <Element4 time="5">
            <Element5 amount="1" price="15.41"/>
            <Element5 amount="2" price="16.41"/>
            <Element5 amount="3" price="17.41"/>
            <Element5 amount="4" price="18.41"/>
          </Element4>
        </Element3>
      </Element2>
    </Element1>
  </Body>
</Envelope>

我需要循环遍历所有Element3节点,然后遍历所有Element5节点以获得类似于此的输出。

day, name, time, amount, price 
2009-10-18, Joe, 1, 0, 16.58 
2009-10-18, Joe, 1, 1, 18.58
2009-10-18, Joe, 1, 2, 20.58
2009-10-18, Joe, 1, 1, 16.58
2009-10-18, Fred, 5, 0, 15.41 
etc

我的linq查询执行此操作看起来像下面我认为很好,直到我意识到这只是抓住它来到的第一个Element5节点。

XDocument doc = XDocument.Load(@"myfile.xml");
        DataContext st = new DataContext();

        var docxml = from c in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3")
                     select new mytable()
                     {
                         MyKey = Guid.NewGuid(),
                         day = Convert.ToDateTime(c.Parent.Attribute("day").Value)
                         name = c.FirstAttribute.Value,
                         hour = Convert.ToInt32(c.Element("Element4").FirstAttribute.Value),
                         price = Convert.ToDecimal(c.Element("Element4").Element("Element5").Attribute("price").Value),
                         amount = Convert.ToDecimal(c.Element("Element4").Element("Element5").Attribute("amount").Value)

                     };
        st.mytable.InsertAllOnSubmit(docxml);
        st.SubmitChanges();

如何将其循环以包含所有Element5节点?

1 个答案:

答案 0 :(得分:2)

每个语句基本上都是一个foreach循环(简单的思考方式) 注意:我必须更改一些父关系

XDocument doc = XDocument.Load(@"myfile.xml");
DataContext st = new DataContext();

var docxml = from c in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3").Elements("Element4")
             from e in c.Elements("Element5")
             select new mytable()
             {
                 MyKey = Guid.NewGuid(),
                 day = Convert.ToDateTime(c.Parent.Parent.Attribute("day").Value)
                 name = c.Parent.FirstAttribute.Value,
                 hour = Convert.ToInt32(c.FirstAttribute.Value),
                 price = Convert.ToDecimal(e.Attribute("price").Value),
                         amount = Convert.ToDecimal(e.Attribute("amount").Value)

             };

st.mytable.InsertAllOnSubmit(docxml);
st.SubmitChanges();

使用let-statement和更好的名称可以使代码更具可读性:

var docxml = from element4 in doc.Elements("Envelope").Elements("Body").Elements("Element1").Elements("Element2").Elements("Element3").Elements("Element4")
             let element3 = element4.Parent
             let element2 = element3.Parent
             from element5 in c.Elements("Element5")
  ...

我无法测试代码,因为我在MacBook上。希望这会有所帮助。

相关问题