正在将xdocument的linq查询追加到列表中

本文关键字:追加 列表 查询 linq xdocument | 更新日期: 2023-09-27 18:28:36

正在努力解决我的代码的一个方面,我希望有人能对其有所了解。

我在一个简单的foreach循环中多次提取xml文档。我想把linq查询附加到一个列表中,但它每次都在重写列表。这是代码:

IEnumerable<TranList> tList;
foreach (var t in otherList)
{
         //pulling xml data from service here - code not shown
         XDocument xDoc = XDocument.Parse(xmlFromService);
         tList = from x in xDoc.Descendants("Items")
         select new TranList
         {
             BusDate = x.Descendants("BusDate").First().Value,
             SeqNum = x.Descendants("SeqNum").First().Value,
             Amount = x.Descendants("Amount").First().Value,
             Credit = x.Descendants("Credit").First().Value
         };
}

这是我的xml供参考:

<Items>
    <DbAmount>25,465.58</DbAmount>
    <DBCount>296</DBCount>
    <CrAmount>.00</CrAmount>
    <CrCount>0</CrCount>
    <Item>
        <ID>0</ID>
        <BusDate>20090126</BusDate>
        <BlockNum>729</BlockNum>
        <SeqNum>2</SeqNum>
        <RelSeqNum>0</RelSeqNum>
        <Serial />
        <Routing>211690953</Routing>
        <Account>123456789</Account>
        <Amount>30.00</Amount>
        <Currency>USD</Currency>
        <Credit>DEBIT</Credit>
        <Onus>TRANSIT</Onus>
    </Item>
    <Item>
    . . . . . . . . . . . . . . .
    </Item>
    . . . . . . . . . . . . . . .
</Items>

谢谢你的帮助!

正在将xdocument的linq查询追加到列表中

您当前每次都重新分配tList,而不是连接:

tList = (from x in xDoc.Descendants("Items")
        select new TranList
        {
            BusDate = x.Descendants("BusDate").First().Value,
            SeqNum = x.Descendants("SeqNum").First().Value,
            Amount = x.Descendants("Amount").First().Value,
            Credit = x.Descendants("Credit").First().Value
        }).Concat(tList);

但是,为什么您首先需要foreach呢?你现在甚至没有使用循环变量,所以这没有多大意义。

将其更改为:

List<TranList> tList = new List<TranList>();
foreach (var t in otherList)
{
     //pulling xml data from service here - code not shown
     XDocument xDoc = XDocument.Parse(xmlFromService);
     tList.AddRange(from x in xDoc.Descendants("Items")
     select new TranList
     {
         BusDate = x.Descendants("BusDate").First().Value,
         SeqNum = x.Descendants("SeqNum").First().Value,
         Amount = x.Descendants("Amount").First().Value,
         Credit = x.Descendants("Credit").First().Value
     });
}

重要的部分是tList现在是一个List<TranList>,您可以通过AddRange(...)向其添加查询结果。

试试这个:

var result = from t in otherList
             from x in XDocument.Parse(xmlFromService(t)).Root.Elements("Item")
             select new TranList
             {
                 BusDate = (string)x.Element("BusDate"),
                 SeqNum = (string)x.Element("SeqNum"),
                 Amount = (string)x.Element("Amount"),
                 Credit = (string)x.Element("Credit")
             };