使用Lambda Select / Where或LINQ Query来实现以下要求

时间:2011-08-22 08:40:12

标签: c#

我有三个属性类(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))));

2 个答案:

答案 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());
    }
)