Tengo algunas dificultades para agregar alguna condición de filtro para los elementos incluidos en mi consulta LINQ. mi consulta es como
var item = _Context.Order.Include("Inner") .Include("Inner.first") .Include("Inner.second") .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))).FirstOrDefault();En el código anterior, "Interior" es otra lista de elementos. Ahora necesito filtrar elementos internos. Solo necesito el elemento interno con la condición de filtro inner.isDeleted = true.
La consulta debe devolver una clase como,
public class Order { public string Name { get; set; } public List<InnerDetails> Inner{ get; set; } public bool IsDeleted { get; set; } }y la clase InnerDetails como
public class InnerDetails { public string Sample { get; set; } public bool IsDeleted { get; set; } public int firstId { get; set; } public int secondID { get; set; } public First first{ get; set; } public Second second{ get; set; } }¿Alguien puede sugerirme un mejor enfoque para hacer esto porque soy nuevo en LINQ y EF?
Descargo de responsabilidad: soy el propietario del proyecto Entity Framework Plus
La función EF+ Query IncludeFilter permite filtrar entidades relacionadas.
var item = _Context.Order .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted)) .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.first)) .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.second)) .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))).FirstOrDefault();Nota: No puede mezclar Incluir e IncluirFiltro.
Wiki: Incluir filtro de consulta de EF+
EDITAR: Responder a la subpregunta
Pero podemos lograr esto usando solo EF
Sí, bajo el capó, mi biblioteca usa una solución similar a la proyección
var item = _Context.Order.Select(x => new { Order = x, Inner = x.Inner.Where(y => y.IsDeleted), first = x.Inner.Where(y => y.IsDeleted).Select(y => y.first) second = x.Inner.Where(y => y.IsDeleted).Select(y => y.second) }) .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))) .FirstOrDefault() .Select(x => x.Order) .FirstOrDefault();Nota: el código no ha sido probado
EDITAR: Responder comentario
Encontré este problema en EF Core. ¿Va a implementar IncludeFilter también en la versión EF+Core?
A partir de la v1.10.0, el IncludeFilter de inclusión ahora es compatible con EF Core 2.x
EDITAR: Responder a la subpregunta
¿Cómo puedo incluir después de filtrar?
Todavía no tenemos un ThenInclude .
Por lo tanto, debe usar IncludeFilter nuevamente con todos los filtros y navegar por la lista o entidad que desea incluir.
Puede lograr esto en EF Core mismo:
var item = ctx.Order.Include("Inner") .Select(x => x.Inner .Where(innerItem => innerItem.IsDeleted)) .FirstOrDefault();O,
var item = ctx.Order.Include(o=> o.Inner .Where(x => x.IsDeleted));