嵌套linq查询
我正在处理这样的xml文件嵌套linq查询,linq,Linq,我正在处理这样的xml文件 <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <Element1> <Element2 day="2009-10-18"> <Element3 name="Joe"> <Element4 time="1"> <Eleme
<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>
我的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节点?每个from语句基本上都是一个foreach循环(很容易理解)。
注意:我不得不改变一些家长关系 通过使用let语句和更好的名称,可以使代码更具可读性:
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上。希望这有帮助
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();
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")
...