2009-10-08 22 views
22

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

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

Respuesta

38

He estado pensando en escribir a tip en esto, pero su pregunta me golpeó hasta el golpe.

Suponiendo una WorkItem tiene muchas WorkItemNotes

usted puede hacer esto:

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 con, y sujeta la correspondiente WorkItem 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.

Asumo que el próximo sólo quiere volver a sólo el WorkItems, así:

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

Entonces si ahora hace esto:

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

verá que WorkItemNotes que coincidan el filtro original se ha agregado a la colección de notas de cada workItem.

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

I.e. esto te da lo que quieres incluir condicional.

Esperanza esto ayuda

Alex

+0

serio? x.Item tendrá los WorkItemNotes apropiados? ¡Eso es genial! Me complace que haya publicado esto porque lo que actualmente tengo consulta es el DB de cada WorkItem. ¡Gracias! –

+0

Una pregunta: ¿Por qué el intermediario debe ser IEnumerable? ¿Puede ser IQueryable? –

+0

Yeap esto funciona. ¡También puedes usar esto para otros trucos, como ordenar, ver el Consejo 1 de mi serie de consejos! –

Cuestiones relacionadas