Как отфильтровать дочерние объекты в родительской сущности на основе дочерних свойств? - PullRequest
1 голос
/ 25 марта 2019

В настоящее время у меня есть объекты с названиями 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 - это идентификатор нужной мне записи):

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), то он полностью удалит отношение FK между Job и Attachment, так что это не будет работать либо.

Я думал, что где-то видел, что то, что я хочу, (в настоящее время) не поддерживается в Entity Framework (версия 2.1, которую я использую), но даже если это так, я не могу понять, даже приемлемый обходной путь.

1 Ответ

0 голосов
/ 25 марта 2019

Рассмотрите возможность использования Any() для достижения этого условия:

var tmpJob = context.Jobs
.Include(j => j.Attachments)
.Where(j => j.Id == 16 && j.Attachments.Any(a => a.IsDeleted == false))
.FirstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...