提问人:NedaM 提问时间:11/11/2023 最后编辑:NedaM 更新时间:11/11/2023 访问量:67
在Linq中,如何获取他们的孩子有特殊年龄的父母列表,而其他孩子也被删除?
In Linq, How to get list of parents that their children have a special age and other childern remove too?
问:
我有两种模型:父模型和子模型
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 中的子项查询?
答:
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();
更新:
作为一项要求,您需要检索所有数据并在一些处理步骤后进行筛选。应循环访问每个父项,并使用筛选后的数据覆盖该值。Parent
Children
Children
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 循环更新每个父项以筛选以下数据:Parent
Children
parent.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,您指的是哪个变量/值? ?ICollection
Children
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()
评论