EntityFramework: Как выбрать родителей, отфильтровывая детей

У меня есть следующие сущности

public class Client
{
    public int ClientID { get; set; }
    public int ClientName { get; set; }

    //children
    public ICollection<Batch> Batches { get; set; }
}

public class Batch
{
    public int BatchID { get; set; }
    public int BatchName { get; set; }

    //parent
    public int ClientID { get; set; }
    public Client Client { get; set; }

    //children
    public ICollection<BatchDetail> BatchDetails { get; set; }
}

public class BatchDetail
{
    public int BatchDetailID { get; set; }
    public int BatchDetailStatus { get; set; }

    //parent
    public int BatchID { get; set; }
    public Batch Batch { get; set; }
}

Тогда у меня есть соответствующий DTO

public class ClientDTO
{
    public int ClientID { get; set; }
    public int ClientName { get; set; }
    public IEnumerable<BatchDTO> Batches { get; set; }
}

public class BatchDTO
{
    public int BatchID { get; set; }
    public int BatchName { get; set; }
    public IEnumerable<BatchDetailDTO> BatchDetails { get; set; }
}

public class BatchDetailDTO
{
    public int BatchDetailID { get; set; }
    public int BatchDetailStatus { get; set; }
}

Я хочу выбрать все детали партии, чей статус New а затем установить их статус Processing и вернуть коллекцию ClientDTO

мой текущий рабочий код ниже

public IEnumerable<ClientDTO> DoSomething()
{
     var result = _dbcontext.BatchDetails
         .Include(x => x.Batch.Client)
         .Where(x => x.BatchDetailStatus == "New")
         .ToList();

     foreach (var detail in result)
     {
        detail.BatchDetailStatus = "Processing";
     }

     _dbContext.SaveChanges();

      // do some logic here on the collection of BatchDetail Entity 
     // to convert it to Collection of ClientDTO          

       return result.ToClientDTOCollection();
   }

В приведенном выше коде я непосредственно фильтрую и выбираю детей и включаю их родителей. Но метод возвращает родительскую коллекцию. Поэтому мне нужно сделать группировку и вернуть родительскую коллекцию.

Таким образом, вместо того, чтобы сделать это, есть в любом случае, чтобы получить Client сущности путем фильтрации на BatchDetail? Таким образом, DBContext должен вернуть Client коллекция и включать отфильтрованные Batch а также BatchDetail

Обратите внимание, что если нет BatchDetail с BatchDetailStatus = "New" тогда запрос не должен возвращать Client

Я попробовал это, и я не работал. Возвращает все Clients а также Batches

      var result = dbcontext.Clients
           .Include(x => x.Batches.Select(y => y.BatchDetails))
           .Where(x => x.Batches.Any(y => y.BatchDetails.Any(z => z.BatchDetailStatus == "New")))
           .ToList();

Я также использую Z.EntityFramework.Plus.EF6 пакет, если это помогает

0 ответов

Другие вопросы по тегам