Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Entity framework 实体框架-检查是否有孙子记录_Entity Framework_Asp.net Core - Fatal编程技术网

Entity framework 实体框架-检查是否有孙子记录

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

我正在使用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;}
}
公家子弟
{
[关键]
公共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
                      });