No sé si se espera que sea así, pero pensé que es extraño ya que cambia los resultados de la consulta.
Cuando ejecuto la consulta a continuación, obtengo mi entidad con solo 2 entidades "Mensagens" porque estoy filtrando solo los activos, así que es correcto, tengo 2 entidades activas en mi base de datos y 1 inactiva.
return await context.Lancamentos .Include(x => x.UsuarioCriacao) .Include(x => x.Mensagens.Where(m => m.Ativo)) .ThenInclude(m => m.MensagemMedias) .ThenInclude(m => m.MediaWhatsapp) .ThenInclude(m => m.TipoMediaWhatsapp) .Include(x => x.Mensagens.Where(m => m.Ativo)) .ThenInclude(x => x.TemplateMensagem) .ThenInclude(t => t.Medias) .ThenInclude(m => m.MediaWhatsapp) .ThenInclude(m => m.TipoMediaWhatsapp) .AsNoTracking() .FirstOrDefaultAsync(l => l.Id == id && l.Ativo); Pero si ejecuto exactamente el mismo comando simplemente eliminando la línea AsNoTracking() me da los 3 registros, tanto activos como inactivos.
Pero el EF inactivo no obtiene el ThenInclude continuación. Cambia el comportamiento.
Con AsNoTracking filtra los datos según el filtro que usé en Include
Sin AsNoTracking me trae todos los datos pero filtra si cargará o no los objetos de ThenInclude .
¿Alguien sabe si esto es un comportamiento normal y por qué se comporta así?
Esto se explica en la documentación de inclusión filtrada :
Precaución
En el caso de consultas de seguimiento, los resultados de la inclusión filtrada pueden ser inesperados debido a una corrección de la navegación . Todas las entidades relevantes que se consultaron previamente y se almacenaron en el Rastreador de cambios estarán presentes en los resultados de la consulta de inclusión filtrada, incluso si no cumplen con los requisitos del filtro. Considere el uso de consultas
NoTrackingo vuelva a crear el DbContext cuando use la inclusión filtrada en esas situaciones.
Entonces, lo más probable es que su contexto no esté limpio al realizar pruebas de seguimiento. E incluso si está limpio, en caso de que se use para ejecutar otras consultas, la corrección de navegación puede cargar algunas entidades de filtro no satisfactorias más tarde , ya que realiza un seguimiento (tiene acceso) a todas las entidades rastreadas.
En general, no puede confiar en el contenido de la propiedad de navegación de una entidad rastreada, ya que puede actualizarse en cualquier momento durante la vigencia del contexto hasta que el contexto se elimine o la entidad se separe del rastreador de cambios. Si necesita un control total, no use consultas de entidad de seguimiento o consultas de proyección de DTO/ ThenInclude , etc. y seleccione exactamente lo que desea (sin Include / luego incluir, simplemente LINQ).