C# 嵌套linq到XML查询

C# 嵌套linq到XML查询,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,如何让LINQ循环嵌套的成功分支?我想循环sum_-sweeden和sum_-japan字段 from book in books.Elements("book") let bookStatus = book.Element("book_status") let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault() let winnings = book.Element("deals

如何让LINQ循环嵌套的成功分支?我想循环
sum_-sweeden
sum_-japan
字段

from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}
这是我的XML结构:

<TheAPI>
  <TheResult>
    <command>booksResults</command>
  </TheResult>
  <TheData>
    <books>
      <book id="101495">
        <coupon_close_date>1366030400</coupon_close_date>
        <coupon_local_close_date>1366012400</coupon_local_close_date>
        <book_status id="1">Published</book_status>
        <book_details>
          <book_detail>
            <author>bnvbnvb</author>
            <publisher>nnbnbn</publisher>           
          </book_detail>
        </book_details>
        <deals_breakdowns>
          <deal_breakdown id="1">
            <winning deal="5">
              <sum_sweeden>715.00</sum_sweeden>
              <sum_japan>715.00</sum_japan>
            </winning>
          </deal_breakdown>
          <deal_breakdown id="2">
            <winning>
              <sum_sweeden>100.00</sum_sweeden>
              <sum_japan>100.00</sum_japan>
            </winning>
          </deal_breakdown>
        </deals_breakdowns>
      </book>
      <book id="101417">
        <coupon_close_date>1387684800</coupon_close_date>
        <coupon_local_close_date>1387666800</coupon_local_close_date>
        <book_status id="1">Published</book_status>
        <book_details>
          <book_detail>
            <author>mn xccx cvx</author>
            <publisher>hjgh hg jghjg</publisher>         
          </book_detail>
        </book_details>
        <deals_breakdowns>
          <deal_breakdown id="1">
            <winning>0</winning>
          </deal_breakdown>
          <deal_breakdown id="2">
            <winning>
              <sum_sweeden >100</sum_sweeden>
              <sum_japan >100</sum_japan>
            </winning>
          </deal_breakdown>
        </deals_breakdowns>
      </book>
  </TheData>
</TheAPI>
from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}

首先-在
中有几个
元素。因此,您需要使用
元素(“deals\u-breakdown”)
选择所有这些元素。第二,您需要聚合(汇总)
元素值,因为您有
SumSweeden
属性,该属性需要单个十进制值,而不是小数的集合:

SumSweeden = node.Element("deals_breakdowns")
                 .Elements("deals_breakdown")
                 .Sum(b => b.Element("winning")
                            .SafeValueAsDecimal("sum_sweeden")),
from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}
还要记住,您可以安全地将元素强制转换为字符串或一些可为空的类型(bool、int、decimal)。考虑到这一点,您可以放弃自定义扩展方法,并使用以下查询:

from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}
结果:

from book in books.Elements("book")
let bookStatus = book.Element("book_status")
let bookDetail = book.Elements("book_details").Elements("book_detail").FirstOrDefault()
let winnings = book.Element("deals_breakdowns").Elements("deal_breakdown").Elements("winning")
select new ResultsBookData()
{
    couponCloseDate = (int)book.Element("coupon_close_date"),
    BookStatusId = (int)bookStatus.Attribute("id"),
    BookStatus = (string)bookStatus,
    Author = bookDetail == null ? null : (string)bookDetail.Element("author"),
    Publisher = bookDetail == null ? null : (string)bookDetail.Element("publisher"),
    SumSweeden = winnings.Sum(w => (decimal?)w.Element("sum_sweeden") ?? 0),
    SumJapan = winnings.Sum(w => (decimal?)w.Element("sum_japan") ?? 0)
}
{
   couponCloseDate: 1366030400.0,
   SumSweeden: 815.00,
   BookStatusId: 1,
   BookStatus: "Published",
   Author: "bnvbnvb",
   Publisher: "nnbnbn",
   SumJapan: 815.00      
},
{
   couponCloseDate: 1387684800.0,
   SumSweeden: 100.0,
   BookStatusId: 1,
   BookStatus: "Published",
   Author: "mn xccx cvx",
   Publisher: "hjgh hg jghjg",
   SumJapan: 100.0
}

你是什么意思?不能使用LINQ“循环”,但可以循环结果。您能告诉我们您需要的最终结果是什么吗?您正在使用API吗?如果是这样的话,为什么不改用xml序列化呢?旁注-这里没有closing
标记
SafeValueAsDecimal
?@JohnSaunders我相信这是自定义扩展OP可能知道,但这个问题的其他读者都不会知道。