Entity framework 实体框架-检查是否有孙子记录
我正在使用asp net core 2.0和实体框架访问MySQL数据库。我的模型结构看起来像Entity framework 实体框架-检查是否有孙子记录,entity-framework,asp.net-core,Entity Framework,Asp.net Core,我正在使用asp net core 2.0和实体框架访问MySQL数据库。我的模型结构看起来像 公共类父类 { [关键] 公共int Id{get;set;} 公共虚拟ICollection子项{get;set;} [未映射] 公共虚拟bool hasgener{get;set;} } 公营儿童 { [关键] 公共int Id{get;set;} public int ParentId{get;set;} 公共虚拟ICollection孙子{get;set;} } 公家子弟 { [关键] 公共i
公共类父类
{
[关键]
公共int Id{get;set;}
公共虚拟ICollection子项{get;set;}
[未映射]
公共虚拟bool hasgener{get;set;}
}
公营儿童
{
[关键]
公共int Id{get;set;}
public int ParentId{get;set;}
公共虚拟ICollection孙子{get;set;}
}
公家子弟
{
[关键]
公共int Id{get;set;}
public int ChildId{get;set;}
}
我想检查类Parent
中是否有孙子的记录。我知道我可以使用Include
和thenclude
检索孩子和孙子。然而,孙辈
确实很大。我不想退货。或者,我可以使用for
循环来计算孙子的数目。比如说,
List p\u List=\u context.Parent.ToList();
foreach(p_列表中的父p)
{
List c\u List=\u context.Child
.其中(c=>c.ParentId==p.Id)
.ToList();
int numberOfGrant=0;
foreach(c_列表中的子c)
{
List gc\u List=\u context.孙子
.Where(gc=>gc.ChildId==c.Id)
.ToList();
numberOfGrander+=gc_list.Count();
}
p、 hasgener=假;
如果(NumberOfGrant>0){
p、 hasgener=true;
}
}
这种方法的性能非常慢,特别是对于大表
是否有更好的方法来检查是否有孙辈记录
var parents = _context.Parents
.Where(p => p.Children.SelectMany(c => c.Grandchildren).Any());
这会给你你想要的。您希望尽量避免包含,因为它会将整个表的列添加到查询中。(至少对我来说是这样
这应该会提供您想要的内容。您希望尽可能避免Include
,因为它会将整个表的列添加到查询中。(至少感谢您的建议。现在我可以选择包含孙辈的条目。但是我如何才能将其分配给变量hasgranter
?我想返回所有实体,但带有一个额外字段hasgranter
@bang您可以使用foreach循环上述父项
,并使用item.hasgranter=t吗rue
?或者您可以使用Select()
手动返回父项。感谢您的建议。现在我可以选择包含孙子项的条目。但是如何将其分配给变量hasgrent
?我想返回所有实体,但要使用一个额外字段hasgrent
@bang您可以使用foreach循环上述父项
并使用item.Ha吗sGrandchild=true
?或者您可以使用Select()
手动返回父项。
var parents = _context.Parents
.Select(p => new { // Can be other DTO if you have one
Parent = p,
HasGrandchildren = p.Children
.SelectMany(c => c.Grandchildren)
.Any()
});
var parents = _context.Parents
.Where(p => p.Children.SelectMany(c => c.Grandchildren).Any())
.Select(p => new {
Parent = p,
HasGrandchildren = true
});