C# 使用Lambda Select/Where或LINQ查询来实现以下要求
我有三个具有属性的类(类:属性) 父项:Id、名称、列表 子项:Id、名称、列表 子孩子:Id、名称、值 我有一份家长名单。我想实现所有那些值(integer)>1和C# 使用Lambda Select/Where或LINQ查询来实现以下要求,c#,C#,我有三个具有属性的类(类:属性) 父项:Id、名称、列表 子项:Id、名称、列表 子孩子:Id、名称、值 我有一份家长名单。我想实现所有那些值(integer)>1和var SubChildsValueFiltered的subchild对象= 其中(P=>P.Child.SelectMany(c=>c.SubChild.All)(sc=>sc.Value>1&&sc.Valuep.List.Any( c=>c.List.Any(sc=>sc.Value>1&&sc.Value1和&sc.值
var SubChildsValueFiltered的subchild对象=
其中(P=>P.Child.SelectMany(c=>c.SubChild.All)(sc=>sc.Value>1&&sc.Value<200));
如果需要,将
All
更改为Any
。更新:已将以前的实现写入我手边的NUnit测试夹具中
第一个父级的子级.Value
为2,因此将通过。第二个父项的子项值为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());
}
)
[TestFixture]
公共类固定
公营小童
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共int值{get;set;}
}
公营儿童
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表{get;set;}
}
公共类父类
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共列表{get;set;}
}
[测试]
公共空间测试()
{
var ListParent=新列表();
ListParent.Add(
新父项()
{
ID=1,
Name=“1”,
List=new List(){new Child(){ID=1,Name=“1”,
List=newlist(){new SubChild(){ID=1,Name=“1”,Value=2}
}}
});
ListParent.Add(
新父项()
{
ID=2,
Name=“2”,
List=new List(){new Child(){ID=2,Name=“2”,
List=newlist(){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)
)
);
arenequal(1,FilteredParent.Count());
WriteLine(FilteredParent.Count());
var FilteredParent2=来自ListParent中的lp
在哪里(
从lp.列表中的c开始
在哪里(
来自c.列表中的sc
其中sc.值>1和&sc.值<200
选择sc
).Any()
选择c
).Any()
选择lp;
AreEqual(1,FilteredParent2.Count());
WriteLine(FilteredParent2.Count());
}
)
您想要具有匹配的子文档的列表还是列表
你的例子返回的是List
而不是List
。我想列出那些有这些孩子的父母,他们的子孩子具有给定的值听起来像这个父母是Parent
的一个实例,而不是列表
-你需要从列表开始筛选它。我上面的例子没有编译。这只是给人一个想法。本例中的ThisParent是一个父项列表,我想筛选那些具有子项且其值在指定范围内的父项。谢谢你有两个答案,看起来都不错,但都不被接受。这使我们认为我们误解了您的需求。请您提供一个数据示例:您拥有什么,以及您希望看到什么。使用All
或Any
确实足够了,但我认为您的公式不够清晰。无法将IEnumerable转换为IEnumerable。我需要得到那些有孩子的父母,他们的子孩子具有给定的值。如果所有孩子的所有子孩子值都通过了测试,它将返回一个家长。正如我所说,您可能需要根据需要将All
更改为Any
。更改为Any后,它根据我返回所有内容的查询和@Jon返回所有内容的查询返回“所有内容”,我认为要么您的数据不是您期望的,要么您没有描述您想要的查询。我所做的是给你一个家长列表,其中任何孩子的任何子孩子的价值都在你给出的范围内。我可能没有正确解释。假设父对象有5个对象的集合。每个对象在其列表属性中都有一个子对象的集合。子列表的计数为3。每个子对象都有子对象列表。每个子项列表中有10个子项(总共5 x 3 x 10个子项)。每个子级都有一个值。尝试您的查询,您将看到返回所有子项。我希望查询返回所有父对象、子对象和具有给定值范围的子对象返回所有父对象,不筛选我希望筛选出具有满足给定条件的子对象的“父”对象。所有父对象都有具有值范围的子对象,因此在我的示例中,应返回每个父对象,但仅返回满足给定条件的子对象。
var SubChildsValueFiltered =
Parents.Where(P => P.Child.SelectMany(c => c.SubChild).All(sc => sc.Value > 1 && sc.Value < 200));
[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());
}
)