在Linq中,如何获取他们的孩子有特殊年龄的父母列表,而其他孩子也被删除?

In Linq, How to get list of parents that their children have a special age and other childern remove too?

提问人:NedaM 提问时间:11/11/2023 最后编辑:NedaM 更新时间:11/11/2023 访问量:67

问:

我有两种模型:父模型和子模型

public class Parent
{
    public int ID { get; set; }
    public string Name{ get; set; }


    public virtual ICollection Children { get; set; }
}
public class Child
{
    public int ID { get; set; }
    public int ParentID { get; set; }
    public string Name{ get; set; }
    public int Age{get; set;}

    [ForeignKey("ParentID")]
    public virtual Parent Parent { get; set; }
}

示例数据:

Parent            Child  

ID      Name     ID    Name    Age  ParentID
1       a        1       a1     10     1
2       b        2       a2     20     1
3       c        3       a3     25     1
4       d        4       b1     30     2
5       e        5       b2     35     2
                 6       c1     27     3
                 7       d1     10     4
                 8       d2     18     4
                 9       d3     26     4
                 10      e1     15     5

我想显示一个父母列表,这些父母有任何孩子大于特定年龄,这个列表将加入儿童模型,在儿童子集中,只显示具有特定年龄的孩子。

期望输出:

parents
ID      Name  Children.ID Children.Name   Age  
1       a        3            a3          25     
2       b        4            b1          30     
3       c        5            b2          35     
4       d        6            c1          27     
                 9            d3          26     
                 

注意:子表位于父表的字段中。

我测试了这段代码,但这显示了所有孩子的父母:

var parents = context.Parents.Include(p => p.Children).ToList();

  // some processes on parents...

parents = parents.Where(p => p.Children.Any(c => c.Age >= 25)).ToList();

输出:

parents
ID      Name  Children.ID Children.Name  Age  
1       a        1                a1     10     
2       b        2                a2     20     
3       c        3                a3     25     
4       d        4                b1     30     
                 5                b2     35     
                 6                c1     27     
                 7                d1     10     
                 8                d2     18     
                 9                d3     26

 
                     

如何筛选 Linq 中的子项查询?

C# 列表 LINQ Lambda 实体框架核心

评论


答:

2赞 Yong Shun 11/11/2023 #1

您可以筛选相关实体,如筛选的包含中所示。

var parents = context.Parents
    .Include(p => p.Children
        .Where(c => c.Age >= 25))
    .Where(p => p.Children.Any(c => c.Age >= 25))
    .ToList();

更新:

作为一项要求,您需要检索所有数据并在一些处理步骤后进行筛选。应循环访问每个父项,并使用筛选后的数据覆盖该值。ParentChildrenChildren

var parents = context.Parents.Include(p => p.Children).ToList();

...

parents = parents.Where(p => p.Children.Any(c => c.Age >= 25)).ToList();

parent.ForEach(p => 
{ 
    p.Children = p.Children
        .Where(c => c.Age >= 25)
        .ToList(); 
});

评论

0赞 NedaM 11/11/2023
对不起!我没有解释父列表必须包含所有数据,并且经过一些过程将被过滤。
1赞 Yong Shun 11/11/2023
在这种情况下,您仍然可以检索所有 s。在处理步骤之后,使用 foreach 循环更新每个父项以筛选以下数据:ParentChildrenparent.ForEach(p => { p.Children = p.Children.Where(c => c.Age >= 25).ToList(); });
0赞 NedaM 11/11/2023
此解决方案不正确,因为 ICollection 不会转换为 IEnumerable。当我使用强制转换时,SQL 服务器会抛出异常
1赞 Yong Shun 11/11/2023
ICollection 不转换为 IEnumerable,您指的是哪个变量/值? ?ICollectionChildren
1赞 NedaM 11/13/2023
感谢您的回复。更新的答案奏效了!!
1赞 Ehsan.Soltani 11/11/2023 #2

试试这个:

parents = parents.Where(p => p.Children.Any(c => c.Age >= 25)).Select(s=>new Parent {
ID=s.ID,
Name=s.Name,
Children= s.Children.Where(c => c.Age >= 25).ToList(),
}).ToList()

评论

0赞 NedaM 11/11/2023
我试过这个,但是这段代码的输出就像我的输出,不是想要的输出
1赞 Ehsan.Soltani 11/11/2023
你也想要过滤器的孩子吗?
1赞 Ehsan.Soltani 11/11/2023
如果您想要过滤任何父母的孩子,请尝试以下方法:父母。其中(p => p.Children.Any(c => c.年龄 >= 25))。Select(s=>new Parent { ID=s.ID, Name=s.Name, Children= s.Children.Where(c => c.Age >= 25)。ToList(), })。ToList()