Как отключить элементы в сетке

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

Кроме того, и это проблема, некоторые результаты должны быть отключены, чтобы пользователь не мог их выбрать.

Пример: Foo имеет N баров. Если я хочу добавить нового отца (бара) к отцу (foo), я перехожу на экран поиска, но хочу, чтобы фильтрованная сетка показывалась как дети с ограниченными возможностями, которые уже связаны с отцом.

В настоящее время я контролирую эту проблему на сервере (запросы к базе данных), делая спецификаций присоединяется в зависимости от сценария и "отключение" результатов, которых я не хочу. Но этот подход приводит к тому, что я не могу повторно использовать запросы (из-за специфических объединений. Возможно, мне нужно искать Bars int order, связать их с другим отцом Baz, и я хочу отключить бары, которые уже связаны с текущим отцом...)

Другим подходом может быть следующее:

  • Сохранить детей (только ids), связанных с отцом в массиве в памяти (javascript)
  • В событии сетки "prerender" (или аналогичном) проверьте для каждого элемента, содержится ли он в предыдущем массиве или нет (поиск по id). Если это так, отметьте его как отключенный (например). Это многоразовое решение на стороне клиента, и я всегда могу повторно использовать один и тот же запрос на стороне сервера.

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

Любая стратегия или предложение?

Изменить: показать пример:

Предполагая эту модель:

Category N:M Item
SalesPromotion N:M Item

У меня есть два разных экрана: один из них относится к одной категории, а другой - к одной рекламной акции. На каждом экране я могу искать элементы и добавлять их в категорию или SalesPromotion. Но когда я ищу элементы, я хочу, чтобы элементы, которые уже относятся к категории /SalesPromotion, отображаются как отключенные (или не показаны, для простоты в этом примере). Я могу сделать это на сервере, выполняя такие запросы:

-- Query for search Items in Category screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId

-- Query for search Items in SalesPromotion screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId

Вы можете себе представить, что произойдет, если у меня будет все больше и больше таких сценариев (с более сложной моделью и запросами, конечно).

Возможна одна альтернатива:

  • Сохранять элементы, которые уже принадлежат текущей категории /SalesPromotion в памяти (javascript, clientside).
  • В событии сетки prerender (или эквиваленте) на клиенте определите, какие элементы должны быть отключены (путем поиска каждой строки в сохраненных элементах).

Итак, мой вопрос заключается в том, что этот подход является хорошим решением или есть хорошо известное решение этой проблемы (я так думаю).

Ответ 1

я изменил свой ответ на основе комментария op

поэтому у вас в основном есть два варианта.

  • удалите сервер Ids после запроса db. (влияет на производительность реакции, но более безопасно).
  • сделать это на стороне клиента с помощью js и удалить их из сетки.

Ответ 2

В SELECT s часть LEFT JOIN бесполезна. В вашем выражении WHERE используется таблица ITEMS, поэтому она не влияет на набор возвращаемых строк, а так как в другой таблице нет соответствующей строки, столбцы для этой другой таблицы - все NULL.

Таким образом, вы можете иметь единственный SELECT * FROM ITEMS i (+ фильтр) и настраивать свой пользовательский интерфейс на основе столбцов CategoryId, PromotionId и т.д. NULL.