Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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
C# 检查实体框架中相关实体计数的通用方法_C#_Entity Framework - Fatal编程技术网

C# 检查实体框架中相关实体计数的通用方法

C# 检查实体框架中相关实体计数的通用方法,c#,entity-framework,C#,Entity Framework,目前我正在使用此代码: opportunity.Contacts.Where(x => x.IsDeleted = false).IsNullOrEmpty() 在每个实体中检查实体中是否存在任何集合(示例Opportunity) 这种方法在数百个地方重复使用且耗时 我们如何使它成为一个通用函数,可以检查实体类型并使用反射或其他方式检查其所有属性,这些属性实现了ICollection,并执行查询以检查它们的计数 [ForeignKey("DepartmentId")] public vi

目前我正在使用此代码:

opportunity.Contacts.Where(x => x.IsDeleted = false).IsNullOrEmpty()
在每个实体中检查实体中是否存在任何集合(示例
Opportunity

这种方法在数百个地方重复使用且耗时

我们如何使它成为一个通用函数,可以检查实体类型并使用反射或其他方式检查其所有属性,这些属性实现了
ICollection
,并执行查询以检查它们的计数

[ForeignKey("DepartmentId")]
public virtual ICollection<DepartmentLocation> DepartmentLocations { get; set; }
[ForeignKey("DepartmentId")]
public virtual ICollection<EmployeePosition> EmployeePositions { get; set; }
[ForeignKey(“部门ID”)]
公共虚拟ICollection部门位置{get;set;}
[外键(“部门ID”)]
公共虚拟ICollection EmployeePositions{get;set;}

即使您确实希望通过反射检查并解析集合来执行这样的检查,我也不推荐这样做。您正在查看的问题域看起来像是您希望围绕软删除强制执行业务逻辑,该逻辑实质上是“如果我的所有孩子都首先被标记为已删除,则我只能被标记为已删除”。尝试通过反射来执行此操作时,您将很快面临的问题包括:

  • 延迟加载命中率
  • 检查删除时的每个对象的复杂而缓慢的代码
懒惰的装载风险和试图逃避它将是我对龙的第一个警告。我将考虑从存储库中利用IQueryable,而不是返回单个域对象。从这里,您可以灵活地深入到模型中,以确定对象是否有任何活动子对象:

var activeState = _opportunityRepository.GetById(companyId, opportunityId) // return IQueryable<Opportunity>
    .Select(o=> new {o.IsDeleted, HasActiveContact = o.Contacts.Any(c=> !c.IsDeleted)})
    .SingleOrDefault();
var-activeState=\u opportunityRepository.GetById(companyId,opportunityId)//返回IQueryable
.Select(o=>new{o.IsDeleted,HasActiveContact=o.Contacts.Any(c=>!c.IsDeleted)})
.SingleOrDefault();

从那里,您可以检查anon.类型的属性。发送到服务器的查询在性能方面应该保持最佳状态,只需点击一次,代码是一个简单的、可扩展的结构,您可以轻松地进行扩展,而不必担心延迟加载等问题。例如,如果要在将父项标记为已删除之前扩展有关哪些子项仍处于活动状态的消息以处理这些子项,则可以将其展开以返回活动的子项。

即使您确实希望通过反射查看并解析集合以执行类似的检查,我也不建议这样做。您正在查看的问题域看起来像是您希望围绕软删除强制执行业务逻辑,该逻辑实质上是“如果我的所有孩子都首先被标记为已删除,则我只能被标记为已删除”。尝试通过反射来执行此操作时,您将很快面临的问题包括:

  • 延迟加载命中率
  • 检查删除时的每个对象的复杂而缓慢的代码
懒惰的装载风险和试图逃避它将是我对龙的第一个警告。我将考虑从存储库中利用IQueryable,而不是返回单个域对象。从这里,您可以灵活地深入到模型中,以确定对象是否有任何活动子对象:

var activeState = _opportunityRepository.GetById(companyId, opportunityId) // return IQueryable<Opportunity>
    .Select(o=> new {o.IsDeleted, HasActiveContact = o.Contacts.Any(c=> !c.IsDeleted)})
    .SingleOrDefault();
var-activeState=\u opportunityRepository.GetById(companyId,opportunityId)//返回IQueryable
.Select(o=>new{o.IsDeleted,HasActiveContact=o.Contacts.Any(c=>!c.IsDeleted)})
.SingleOrDefault();

从那里,您可以检查anon.类型的属性。发送到服务器的查询在性能方面应该保持最佳状态,只需点击一次,代码是一个简单的、可扩展的结构,您可以轻松地进行扩展,而不必担心延迟加载等问题。例如,如果要在将父项标记为已删除之前扩展有关哪些子项仍处于活动状态的消息,可以将其展开以返回活动的子项。

为什么不在关系上启用级联删除?或者如果不需要,则禁用级联。。。删除时级联的默认值取决于所需或可选的关系…为什么不在关系上启用级联删除?如果不需要,则禁用级联。。。删除时级联的默认值取决于所需或可选的关系。。。