2011-03-10 13 views
9

Intento utilizar LINQ para crear una lista agrupada de documentos basados ​​en metadatos que es una lista en el documento.LINQ: agrupación basada en la propiedad en la sublista

A continuación se muestra cómo la estructura de mi objeto se ve:

List<Document> 
     --> List<Metadata> 
         --> Metadata has a name and a value property. 

que desea agrupar los documentos en función de una etiqueta de metadatos que tiene un nombre: Identificación y agruparlos en donde los valores de la propiedad ID son los mismos.

me trataron así:

var x = response.Document 
     .GroupBy(d => d.Metadata.Where(dc => dc.Name == DocProperty.ID) 
     .Select(dc => dc.Value)); 

Esto se traduce en una lista de documentos individuales, pero no agrupados en la ID.

También se pensó en seleccionar una lista distinta de ID y luego recorrer la lista de documentos y buscar documentos que coincidan con la ID. Parece una gran cantidad de sobrecarga, porque por cada ID en la lista distinta tengo que ir cada vez a la lista de metadatos y encontrar los documentos y tener que realizar comprobaciones adicionales para encontrar varios elementos, obtener la propiedad que necesito, etc.

¿Alguien tiene una buena idea sobre cómo hacer que esto funcione?

Respuesta

17
var x = from doc in source 
     from meta in doc.Metadata 
     where meta.Name == DocProperty.Id 
     group doc by meta.Value; 

O (comentarios) notación tan fluido:

var y = source 
    .SelectMany(doc => doc.Metadata, (doc, meta) => new { doc, meta }) 
    .Where(pair => pair.meta.Name == DocProperty.Id) 
    .GroupBy(pair => pair.meta.Value, pair => pair.doc); 
+0

que funciona! Gracias – ChristiaanV

+0

¿Hay alguna manera fácil de ocultar esto a la notación fluida? Lo intenté, pero no estoy seguro de dónde colocar el GroupBy, por lo que puede acceder a la propiedad meta.value. Esto es lo que intentado: var y = response.Document .GroupBy (d => d.DocumentCharacteristic .Where (dc => dc.Name == DocProperty.InvoiceNumber) .Seleccionar (dc => dc.Value)); – ChristiaanV

+1

Tenga en cuenta que meta.Value debe ser '.Key' en cada agrupación ... –

Cuestiones relacionadas