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
пакет, если это помогает