繁体   English   中英

Linq 查询子列表中的where子句

[英]Linq query where clause in sub list

试图获取只有某些子实例的实例。

有两个类:

class Center
{
   public int Id { get; set; }
   public string Name { get; set; }
   public List<Sub> SubList { get; set; }
}

class Sub
{
   public string Code { get; set; }
   public DateTime? EndDate { get; set; }
}

填充数据:

void Main()
{
   var list = new List<Center>();
   list.Add(new Center
   {
      Id = 1,
      Name = "Main1",
      SubList = new List<Sub>
      {
        new Sub { Code = "A", EndDate = null },
        new Sub { Code = "B", EndDate = new DateTime(2021,2,1) },
        new Sub { Code = "C", EndDate = new DateTime(2021,2,1) },
      }
   });

   list.Add(new Center
   {
      Id = 2,
      Name = "Main2",
      SubList = new List<Sub>
      {
        new Sub { Code = "X", EndDate = null },
        new Sub { Code = "Y", EndDate = null },
        new Sub { Code = "Z", EndDate = null },
      }
   });
}

我想获得一个“中心”列表,其中只有结束日期为 null 或将来的子列表。 所以结果应该是(在json中):

[
  {
    "Id": 1,
    "Name": "Main1",
    "SubList": [
      {
        "Code": "A",
        "EndDate": null
      }
    ]
  },
  {
    "Id": 2,
    "Name": "Main2",
    "SubList": [
      {
        "Code": "X",
        "EndDate": null
      },
      {
        "Code": "Y",
        "EndDate": null
      },
      {
        "Code": "Z",
        "EndDate": "2021-06-04T00:00:00"
      }
    ]
  }
]

想出了:

   var l = list.Select(
      x =>
      new
      {
         x.Id,
         x.Name,
         SubList = x.SubList.Where(s => s.EndDate == null || s.EndDate > DateTime.Now)
      });

这是我想要的结果,但这可以更容易地完成吗? 就像是:

var l = list.Where(x => x.SubList.Where(s => s.EndDate == null || s.EndDate > DateTime.Now)

我建议在您的CenterSub class 中添加一个复制方法:

class Center
{
   public int Id { get; set; }
   public string Name { get; set; }
   public List<Sub> SubList { get; set; }

   public Center Copy()
   {
     return new Center { Id = this.Id, Name = this.Name, SubList = this.SubList.Select(x => x.Copy()).ToList() };
   }
}

class Sub
{
   public string Code { get; set; }
   public DateTime? EndDate { get; set; }

   public Sub Copy()
   {
      return new Sub { Code = this.Code, EndDate = this.EndDate };
   }
}

然后你可以先复制你的列表:

var l = list.Select(center => center.Copy()).ToList();

它不是 LINQ,但您可以使用List<T>ForEach修改此副本:

l.ForEach(x => x.SubList = x.SubList.Where(s => s.EndDate == null || s.EndDate > DateTime.Now).ToList());

如果可以修改原始列表,则不需要复制的东西。 只需使用:

list.ForEach(x => x.SubList = x.SubList.Where(s => s.EndDate == null || s.EndDate > DateTime.Now).ToList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM