ILookup магазин под несколькими ключами

У меня есть ситуация, когда у меня есть набор объектов, эти объекты относятся к элементам в базе данных. Мы создаем локальный кеш этих объектов вместе с индексами, чтобы обеспечить быструю фильтрацию / поиск данных. У меня возникла проблема с преобразованием списка объектов в поисковый запрос.

(очень) упрощенный объект:

String ItemID;
List<String> LocationIDs;

Элемент может принадлежать нескольким местоположениям, и каждое местоположение может содержать несколько элементов.

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

Я попробовал следующее

items.ToLookup(item => item.LocationIDs);

Но это не возвращает желаемый результат.

Идеальное использование будет:

Уважать:

{
    ["Location 1"] => {
        {Item 1},
        {Item 2},
        {Item 3},
        {Item 9},
    },
    ["Location 2"] => {
        {Item 2},
        {Item 4},
        {Item 3}
    },
    ["Location 3"] => {
        {Item 1},
        {Item 3},
        {Item 7}
    },
    ["Location 4"] => {
        {Item 1},
        {Item 2},
        {Item 10}
    }
}

Тогда вы можете легко получить предметы для данного места.

Любая помощь приветствуется.

Спасибо

1 ответ

Решение

Предполагая, что это должно быть из LocationID -> ItemID, одним из способов будет:

items.SelectMany(item => item.LocationIDs,
                 (item, locationID) => new { item.ItemID, LocationID = locationID })
     .ToLookup(tuple => tuple.LocationID, tuple => tuple.ItemID)

Это сначала сводит все ваши данные в последовательность (itemID, locationID) кортежей, а затем превращает их в поиск.

Это тривиальная модификация вышеприведенного, если поиск должен происходить из объекта LocationID -> Item.

Другие вопросы по тегам