如何根据子属性在父实体中过滤子实体?

时间:2019-03-25 14:23:09

标签: c# entity-framework-core

我目前拥有名为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关系,因此将无法正常工作要么。

我以为我在某个地方看到(当前)实体框架不支持我想要的东西(2.1是我正在使用的版本),但是即使是那样,我还是不知所措甚至可以接受的解决方法。

1 个答案:

答案 0 :(得分:0)

考虑使用Any()来达到该条件:

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