You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤List<object>中指定索引子列表含Paid=true项的元素?

解决方案

最直接高效的方式是在Select之前添加Where条件,直接过滤源数据中ActivityPayments集合里存在至少一个Paid=true项的记录,避免不必要的投影操作,性能更优。

修改后的完整代码如下:

.AsEnumerable()
// 新增的Where条件,直接判断源数据的ActivityPayments
.Where(p => p.ActivityPayments.Any(q => q.Paid))
.Select(p => new List<object>()
{
    p.ID,
    p.DateActivity.HasValue ? p.DateActivity.Value.ToString("yyyyMMdd") : null,
    p.DateActivity.HasValue ? p.DateActivity.Value.Month.ToString() : null,
    p.DateActivity.HasValue ? p.DateActivity.Value.Year.ToString() : null,
    p.Clinic.ID,
    p.Clinic.Name,
    p.Patient.LastName + " " + p.Patient.FirstName,
    p.Patient.Gold,
    p.Patient.PromoSmiles,
    p.TreatmentType.Description ?? "",
    p.PaymentMethod.Description ?? "",
    p.ActivityPayments.Select((q, index) => new
    {
        Description = q.PaymentTypeID == (int)PaymentType.ACCONTO ? labelAcconto : q.PaymentTypeID == (int)PaymentType.SINGOLOPAGAMENTO && p.PaymentMethod.ID == 1 ? labelRata + (index - p.ActivityPaymentsNonSinglePaymentCount + 1) : labelImporto,
        Amount = q.Amount,
        Date = q.Date,
        Paid = q.Paid
    })
})
.ToList();

补充说明

如果因特殊需求必须在Select之后过滤(不推荐,会先完成所有投影再过滤,性能较差),需要把List<object>中索引11的元素转为动态集合再判断:

.AsEnumerable()
.Select(p => new List<object>()
{
    // 原Select内容不变
})
.Where(list => 
{
    var payments = list[11] as IEnumerable<dynamic>;
    return payments != null && payments.Any(q => q.Paid);
})
.ToList();

优先选择第一种Select前加Where的方案,逻辑清晰且性能更优。

内容的提问来源于stack exchange,提问作者markzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:25:19