如何过滤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
相关产品推荐
相关产品推荐

