Запрос Linq к двум объектам с вложенным массивом

#linq

#linq

Вопрос:

У меня есть два объекта, извлеченных из двух отдельных файлов JSON. Один является источником, другой — ссылкой для поиска конкретных данных из источника.

Исходный JSON:

  {
    "options": [
        {
            "id": 1,
            "product_id": 1,
            "size": "S",
            "color": "red"
        },
        {
            "id": 2,
            "product_id": 1,
            "size": "M",
            "color": "red"
        },
        {
            "id": 3,
            "product_id": 1,
            "size": "L",
            "color": "red"
        },
        {
            "id": 4,
            "product_id": 1,
            "size": "XL",
            "color": "red"
        },
        {
            "id": 5,
            "product_id": 1,
            "size": "S",
            "color": "blue"
        },
        {
            "id": 6,
            "product_id": 1,
            "size": "M",
            "color": "blue"
        },
        {
            "id": 7,
            "product_id": 1,
            "size": "L",
            "color": "blue"
        },
        {
            "id": 8,
            "product_id": 1,
            "size": "XL",
            "color": "blue"
        }
    ]
}
  

Поиск в формате JSON:

 {
    "product": {
        "styles": [
            {
                "color": "red",
                "options": [1,2,3,4]
            },
            {
                "color": "blue",
                "options": [5,6,7,8]
            }
        ]
    } 
}
  

Оба десериализованы для моделей C #.

Мне нужно получить список различных размеров по всем параметрам, поэтому я запрашиваю следующим образом:

 var sizes = (from o in options
             from s in product.styles
             from ss in s.optionIds
             where ss == o.id
             select new Size
             {
                name = v.size,
                optionIds = // needs to be an array with all option ids 
             }
             ).ToList().GroupBy(ps => ps.name).Select(ps => ps.First()).ToList();
  

Раздел from / where работает должным образом, и я получаю список или различные размеры, однако мне также нужно перечислить все идентификаторы параметров в новом объекте Size…смотрите комментарий в коде.

Результирующий массив, который я ожидаю:

 [
    {
        "name": "S",
        "optionIds": [1,5]
    },
    {
        "name": "M",
        "optionIds": [2,6]
    },
    {
        "name": "L",
        "optionIds": [3,7]
    },
    {
        "name": "XL",
        "optionIds": [4,8]
    }
]
  

Ответ №1:

Насколько я могу судить, ваш «lookup JSON» не содержит никакой информации, которая еще не найдена в источнике, поэтому нет смысла мутить воду с этими данными.

 var sizes = options
    .GroupBy(o => o.size, o => o.id)
    .Select(g => new Size {name = g.Key, options = g.ToList()})
    .ToList()
  

Комментарии:

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

2. @Scott: Можете ли вы обновить свой вопрос, чтобы отобразить данные в ожидаемом массиве результатов, которые должны поступать из JSON поиска?