[英]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)
我建议在您的Center
和Sub
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.