LINQ: группировка на основе свойства в подсписке

Я пытаюсь использовать LINQ для создания сгруппированного списка документов на основе метаданных, которые представляют собой список в документе.

Ниже показано, как выглядит моя структура объекта:

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

Я хочу сгруппировать документы на основе тега метаданных с именем: ID и сгруппировать их там, где значения свойства ID совпадают.

Я пробовал это так:

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

В результате получается список отдельных документов, но не сгруппированных по идентификатору.

Также подумал о том, чтобы выбрать отдельный список идентификаторов, а затем просмотреть список документов и найти документы, соответствующие идентификатору. Это кажется большим накладным расходом, потому что для каждого идентификатора в отдельном списке мне приходится каждый раз заходить в список метаданных и находить документы, а также выполнять дополнительные проверки для нескольких найденных элементов, получать нужное мне свойство и т. д.

У кого-нибудь есть хорошая идея о том, как заставить эту штуку работать?


person ChristiaanV    schedule 10.03.2011    source источник


Ответы (1)


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

Или (комментарии) как свободное обозначение:

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);
person Marc Gravell    schedule 10.03.2011
comment
Есть ли простой способ преобразовать это в беглую нотацию? Я попробовал, но не совсем уверен, куда поместить GroupBy, чтобы он мог получить доступ к свойству meta.value. Вот что я пробовал: var y = response.Document .GroupBy(d => d.DocumentCharacteristic .Where (dc => dc.Name == DocProperty.InvoiceNumber) .Select (dc => dc.Value)); - person ChristiaanV; 10.03.2011