首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于集合中集合的Linq子句

用于集合中集合的Linq子句
EN

Stack Overflow用户
提问于 2013-10-22 13:00:05
回答 2查看 4.8K关注 0票数 2

我有一张发票清单和一份付款时间表清单,而付款时间表有一组日记账。

发票->付款时间表->付款时间表日志

我想得到所有发票,有付款时间表,日记账状态,到期和逾期。

我无法让Linq语句深入到第二层。

我正在尝试这样的方法,但没有成功(状态是一个状态列表):

代码语言:javascript
运行
复制
i => i.PaymentSchedules.Any(p => p.PaymentScheduleJournals.Where(ps => statuses.Contains(ps.Status)))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-22 13:03:03

试试这个:

代码语言:javascript
运行
复制
var invoices = Invoices.Where(
               i => i.PaymentSchedules.Where(
                    p => p.PaymentScheduleJournals.Where(
                         ps => statuses.Contains(ps.Status))
                    .Any())
               .Any());

请记住,如果找到任何匹配项,Any()将返回truefalse,而不是项目本身。因此,在代码中包含Any()时,实际上不会返回任何数据。

此外,如果由自己运行,此查询将返回付款计划(不确定这是否只是您在问题中的表达式的一部分),而不是发票。

进一步说明:此查询查找在有效状态列表中具有PaymenScheduleJournal状态的任何PaymenScheduleJournal。请记住,对Where()的调用将返回实际的查询项,但对于日志,这不是我们想要的:我们需要所有具有有效日志的计划。这就是Any()给我们的--任何有日记的时间表。我们重复相同的过程来加载任何有有效付款时间表的发票,因为发票是我们真正想要的(请注意没有第三次调用Any())。

票数 7
EN

Stack Overflow用户

发布于 2013-10-22 13:44:09

您可以使用SelectMany投影运算符。

代码语言:javascript
运行
复制
var validStatuses = new List<string>{"Due", "Overdue"};

var invoices = allInvoices
    .Select(invoice => invoice.Schedules
        .SelectMany(paymentSchedule => paymentSchedule.Journals)
        .Where(journal => validStatuses.Contains(journal.Status)));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19518627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档