C# 嵌套linq到XML查询
如何让LINQ循环嵌套的成功分支?我想循环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
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可能知道,但这个问题的其他读者都不会知道。