簡體   English   中英

嵌套linq到XML查詢

[英]nested linq to XML query

我如何讓LINQ循環嵌套的獲勝分支? 我想循環sum_sweedensum_japan字段。

這是我的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>

我能夠使用LINQ成功地將所有book循環播放:

public class ResultsBookData
{
    public decimal couponCloseDate { get; set; }
    public decimal SumSweeden { get; set; }
    public int BookStatusId { get; set; }
    public string BookStatus { get; set; }
    public string Author { get; set; }
    public string Publisher { get; set; }
    public decimal SumJapan { get; set; }              
}

var result = (from node in books.Elements("book")
              select new ResultsBookData()
              {
                  couponCloseDate = node.SafeValueAsInt("coupon_close_date"),
                  SumSweeden = node.SafeValueAsInt("sum_sweeden"),
                  BookStatusId = node.SafeAttAsInt("book_status", "id"),
                  BookStatus = node.SafeValueAsString("book_status"),
                  Author = node.Element("book_details").HasElements ? node.Element("book_details").Element("book_detail").Element("author").Value : null,
                  Publisher = node.Element("book_details").HasElements ? node.Element("book_details").Element("book_detail").Element("publisher").Value : null,      
                  SumSweeden = node.Element("deals_breakdowns").Element("deals_breakdown").Element("winning").SafeValueAsDecimal("sum_sweeden"),      
                  SumJapan = node.Element("deals_breakdowns").Element("deals_breakdown").Element("winning").SafeValueAsDecimal("sum_japan"),
              }).ToList()

首先-在<deals_breakdowns>有幾個<deals_breakdown>元素。 因此,您需要使用Elements("deals_breakdown")選擇所有它們。 其次-您需要匯總(匯總) <sum_sweeden>元素值,因為您具有SumSweeden屬性,該屬性期望單個十進制值,而不是十進制集合:

SumSweeden = node.Element("deals_breakdowns")
                 .Elements("deals_breakdown")
                 .Sum(b => b.Element("winning")
                            .SafeValueAsDecimal("sum_sweeden")),

還請記住,您可以安全地將元素強制轉換為字符串或某些可為null的類型(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)
}

結果:

{
   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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM