【发布时间】:2021-01-16 08:58:55
【问题描述】:
我有两个名为 Service 和 ServiceBranch 的 EF Core 实体模型:
public class Service
{
public Guid ID { get; set; }
public Guid? ParentServiceID { get; set; } // foreign key to the same table
public string Name { get; set; }
public DateTime? DateDeleted { get; set; }
public virtual ICollection<Service> InverseParent { get; set; } // navigation property
public virtual ICollection<ServiceBranch> ServiceBranches { get; set; } // navigation property
}
public class ServiceBranch
{
public Guid ID { get; set; }
public Guid ServiceID { get; set; } // foreign key
public string Name { get; set; }
public DateTime? DateDeleted { get; set; }
public virtual Service Service { get; set; } // navigation property
}
为简单起见,假设父服务只能有一级子服务。许多服务分支都引用了父服务和子服务。
我想更新特定服务 ID 的 DateDeleted 字段,并在引用它的所有其他行中更新 DateDeleted(如果该字段还没有值)。
目前,我对所有必需实体的调用如下所示:
var serviceEntity = _context.Set<Service>().Where(x => x.ID == neededID && x.DateDeleted == null)
.Include(x => x.ServiceBranches)
.Include(x => x.InverseParent)
.ThenInclude(InverseParent => InverseParent.ServiceBranches)
.FirstOrDefault();
我对主要实体使用 Where 子句,但遗憾的是我不能在 .Includes 中使用 Where 子句,因为我们还没有升级到 EF Core 5.0(它支持在 .Includes 中进行过滤)。
因此,我从数据库中带来了太多不需要的行(其中 DateDeleted 已经有一个值),然后通过将该字段与 null 进行比较,在 foreach 循环中过滤它们:
if (myentity.DateDeleted == null) myentity.DateDeleted = DateTime.Now;
我想重写我的查询,以便使用“join”而不是“.Include”,如下所示:
var serviceEntity = from service in _context.Set<Service>()
where service.ID == neededID && service.DateDeleted == null
join branches in _context.Set<ServiceBranch>() on service.ID equals branches.ServiceID
where branches.DateDeleted == null // filter which I cannot use with .Include-s
let // whatever, can't make it work
select // etc
我不知道如何重写它。或者甚至可以通过连接来实现。
【问题讨论】:
-
有无数关于过滤包含的问题,虽然它还不被支持。您应该能够在其中许多中找到解决方法。一个提示:不要加入。使用与 Include 相同的导航属性。
标签: c# linq asp.net-core entity-framework-core