Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Lambda Select/Where或LINQ查询来实现以下要求_C# - Fatal编程技术网

C# 使用Lambda Select/Where或LINQ查询来实现以下要求

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.值

我有三个具有属性的类(类:属性)

父项:Id、名称、列表

子项:Id、名称、列表

子孩子:Id、名称、值

我有一份家长名单。我想实现所有那些值(integer)>1和
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());
    }
)