【问题标题】:How do I filter the child entities within a parent entity based on child properties?如何根据子属性过滤父实体中的子实体?
【发布时间】:2019-08-15 19:46:33
【问题描述】:

我目前有名为 Job(父实体)和 Attachment(子实体,具有非对多关系)的实体。 Attachment 实体有一个名为 IsDeleted 的布尔属性,因此我可以使用它来“删除”用户所关心的数据,但实际上,将其原封不动地保留在数据库中。当然,这意味着我需要确保我的查询不包括正确的子实体。

我不知道如何使用 .Include 来获取大部分附件,但故意排除 IsDeleted == true 的附件

这些实体的模型如下:

public class Job
{
    public int Id { get; set; }
    public string Title { get; set; }

    public List<Attachment> Attachments { get; set; }
}
public class Attachment
{
    public int Id { get; set; }
    public string Filename { get; set; }
    public bool IsDeleted { get; set; }
}

如何在数据库上下文中查询 Jobs 实体,使其包含所有附件,但不包含 IsDeleted == true 的附件?

例如,如果我使用以下查询(我知道 16 是我需要的记录的 id):

var tmpJob = context.Jobs
    .Include(j => j.Attachments)
    .Where(j => j.Id == 16)
    .FirstOrDefault()

这给了我所有的附件,包括被删除的。

但我似乎无法做类似的事情 .Include(j => j.Attachments.Where(a => a.IsDeleted == false) 因为那根本行不通。

我什至考虑过手动删除项目的解决方法,例如:

    var attachments = new List<Attachment>();
    foreach (var attachment in tmpJob.Attachments)
    {
        if (!attachment.IsDeleted)
            attachments.Add(attachment);
    }
    tmpJob.Attachments = attachments;

不幸的是,如果我这样做,并且稍后我对 tmpJob 实体进行更改(并对其执行 context.SaveChanges),那么它会完全删除 Job 和 Attachment 之间的 FK 关系,这样就行不通了要么。

我以为我在某处看到我想要的东西在 Entity Framework 中(当前)不支持(2.1 是我正在使用的版本),但即使是这样,我也不知所措甚至是可接受的解决方法。

【问题讨论】:

标签: c# entity-framework-core


【解决方案1】:

考虑使用Any() 来实现该条件:

var tmpJob = context.Jobs
.Include(j => j.Attachments)
.Where(j => j.Id == 16 && j.Attachments.Any(a => a.IsDeleted == false))
.FirstOrDefault()

【讨论】:

  • 我试过 @jcvegan,它返回的实体仍然有所有附件(包括 IsDeleted == true 的那些)。我不确定我错过了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 2012-02-24
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多