我有三个属性类(Class:Properties)
父级:Id,名称,列表
儿童:身份证,姓名,名单
SubChild:Id,Name,Value
我有一份家长名单。我想要实现所有具有值(整数)> 1且<200
的子对象编辑:为了更好的解释 所以,如果我有列表计数5即 Parent1,Parent2,...,Parent5
每个Parent实例都有一个子列表。所以.. Parent1.Children.Count = 3, Parent2.Children.Count = 3等
每个Child对象有10个子子对象。所以Parent1.Children [0] .SubChildren.Count = 10。
每个子孩子的值都在1到5000之间。所有父母都有这些子孩子
我想找回5位父母,有3个孩子,只有符合价值标准的子女。
我尝试使用以下查询,但它不起作用:
List<Parent> Parents = ThisParent.Where(
m => m.Child.Where(c => c.SubChild.Where(
t => t.Value > Convert.ToInt32(1)
&&
t.Value < Convert.ToInt32(200))));
答案 0 :(得分:0)
var SubChildsValueFiltered =
Parents.Where(P => P.Child.SelectMany(c => c.SubChild).All(sc => sc.Value > 1 && sc.Value < 200));
如果需要,请将All
更改为Any
。
答案 1 :(得分:0)
更新:已将之前的实现编写到我非常方便的NUnit测试夹具中。
第一个父亲的Subchild.Value
是2,所以会通过。第二个父级的SubChild.Value
是201,因此会失败。
所有断言传递:
[TestFixture]
public class SOFixture
public class SubChild
{
public int ID { get; set; }
public string Name { get; set; }
public int Value { get; set; }
}
public class Child
{
public int ID { get; set; }
public string Name { get; set; }
public List<SubChild> List { get; set; }
}
public class Parent
{
public int ID { get; set; }
public string Name { get; set; }
public List<Child> List { get; set; }
}
[Test]
public void SOTest()
{
var ListParent = new List<Parent>();
ListParent.Add(
new Parent()
{
ID = 1,
Name = "1",
List = new List<Child>() { new Child () {ID = 1, Name = "1",
List = new List<SubChild>() { new SubChild() {ID = 1, Name = "1", Value = 2}}
}}
});
ListParent.Add(
new Parent()
{
ID = 2,
Name = "2",
List = new List<Child>() { new Child () {ID = 2, Name = "2",
List = new List<SubChild>() { new SubChild() {ID = 2, Name = "2", Value = 201}}
}}
});
Assert.AreEqual(2, ListParent.Count());
Console.WriteLine(ListParent.Count());
var FilteredParent = ListParent.Where(
p => p.List.Any(
c => c.List.Any(sc => sc.Value > 1 && sc.Value < 200)
)
);
Assert.AreEqual(1, FilteredParent.Count());
Console.WriteLine(FilteredParent.Count());
var FilteredParent2 = from lp in ListParent
where (
from c in lp.List
where (
from sc in c.List
where sc.Value > 1 && sc.Value < 200
select sc
).Any()
select c
).Any()
select lp;
Assert.AreEqual(1, FilteredParent2.Count());
Console.WriteLine(FilteredParent2.Count());
}
)