我目前拥有名为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是我正在使用的版本),但是即使是那样,我还是不知所措甚至可以接受的解决方法。
答案 0 :(得分:0)
考虑使用Any()
来达到该条件:
var tmpJob = context.Jobs
.Include(j => j.Attachments)
.Where(j => j.Id == 16 && j.Attachments.Any(a => a.IsDeleted == false))
.FirstOrDefault()