Consulta de EF con inclusión condicional

Tengo dos tablas: una tabla WorkItem y una tabla WorkItemNote. ¿Cómo devuelvo un WorkItem y todos los WorkItemNotes que cumplen ciertos criterios?

Creo que esto debería ser simple, casi como un “Incluir” condicional, ¿verdad?

He estado planeando escribir un consejo sobre esto, pero tu pregunta me golpeó hasta el golpe.

Suponiendo que WorkItem tiene muchas WorkItemNotes

Puedes hacerlo:

 var intermediary = (from item in ctx.WorkItems from note in item.Notes where note.SomeProp == SomeValue select new {item, note}).AsEnumerable(); 

Esto produce un elemento anónimo para cada WorkItemNote que coincide y contiene el WorkItem correspondiente también.

La resolución de identidad EF asegura que el mismo WorkItem (por referencia) se devuelve varias veces si tiene múltiples WorkItemNotes que coinciden con los criterios.

Supongo que a continuación quieres volver solo a los WorkItems , así:

 var workItems = intermediary.Select(x => x.item).Distinct().ToList(); 

Entonces, si ahora haces esto:

 foreach(var workItem in workItems) { Console.WriteLine(workItem.Notes.Count) } 

Verá que las WorkItemNotes que coinciden con el filtro original se han agregado a la colección de Notes de cada workItem .

Esto se debe a algo llamado Reparación de Relaciones.

Es decir, esto le da lo que quiere incluir condicional.

Espero que esto ayude

Alex