Информация об изменениях

Сообщение Репозиторий. Как сделать поиск с исключением от 06.11.2025 7:00

Изменено 06.11.2025 10:56 zelenprog

Репозиторий. Как сделать поиск с исключением
Здравствуйте!

Есть небольшая программа. Сделана в целом по принципам "внедрения зависимостей" и "чистой архитектуры".

Что надо сделать.

Бизнес-операция (usecase) должна выполнить необычный поиск по Репозиторию неких Сущностей (в нашем случае, сущности — это юридические лица).
Поиск выполняется по нескольким "критериям" поиска. Каждый "критерий" — это произвольный набор полей Сущности и их значения ("Поле" — "Значение").
Например:
— Критерий-1: "краткое название" = "Ромашка", "ИНН" = "11223344556600"
— Критерий-2: "юридическое наименование" = "ООО Ромашка", "регион регистрации" = "Москва"
— Критерий-3: "ИНН" = "55667788443322", "КПП" = "6010200001"

Одно и тоже юрлицо может быть найдено по разным критериям. Например, и по первому критерию и по второму критерию.
Особенность поиска в том, что после поиска по какому-то Критерию из дальнейшего поиска исключаются сущности, найденные по этому критерию.
То есть алгоритм должен быть примерно таким:

var repository = new Repository();
var criteria_array = new Criteria[];
// заполнение массива Критериев
foreach (var criteria in criteria_array)
{
    var found_entities = repository.FindByCriteria(criteria);
    ...
    // исключаем найденные сущности из дальнейшего поиска
    ...
    // добавляем найденные сущности в отдельную кеш-таблицу, в которой есть дополнительная колонка "Критерий"
    // для каждой сущности запоминаем критерий, по которому была найдена эта сущность
    cashe_table.Add(found_entities, criteria);
}


Пример. Предположим, в БД есть юридическое лицо со следующими полями:
— "юридическое наименование" = "ООО Ромашка"
— "краткое название" = "Ромашка"
— "регион регистрации" = "Москва"
— "ИНН" = "11223344556600".
Это юридическое лицо может быть найдено по Критерию-1 и по Критерию-2.
Однако, нам нужно, чтобы после нахождения по Критерию-1, это юрлицо не попало в выборку по Критерию-2.
То есть, найденные юрлица исключаются из следующих поисков. То есть это постоянно "сужающийся" поиск.

Была мысль сделать это "топорно": читаем все сущности во временную таблицу, в которой есть поле-"флажок".
Поиск выполняем по этой временной таблице. И после поиска по каждому критерию для найденных сущностей "включаем" этот "флажок".
При поиске по каждому критерию добавляем в условия поиска кроме самого критерия дополнительное условие "флажок" = "выключен".

Но нам этот подход кажется сомнительным.

Посоветуйте плиз как сделать грамотно в русле разделения слоев и "чистой архитектуры".
Репозиторий. Как сделать поиск с исключением
Здравствуйте!

Есть небольшая программа. Сделана в целом по принципам "внедрения зависимостей" и "чистой архитектуры".

Что надо сделать.

Бизнес-операция (usecase) должна выполнить необычный поиск по Репозиторию неких Сущностей (в нашем случае, сущности — это юридические лица).
Поиск выполняется по нескольким "критериям" поиска. Каждый "критерий" — это произвольный набор полей Сущности и их значения ("Поле" — "Значение").
Например:
— Критерий-1: "краткое название" = "Ромашка", "ИНН" = "11223344556600"
— Критерий-2: "юридическое наименование" = "ООО Ромашка", "регион регистрации" = "Москва"
— Критерий-3: "ИНН" = "55667788443322", "КПП" = "6010200001"

Одно и тоже юрлицо может быть найдено по разным критериям. Например, и по первому критерию и по второму критерию.
Особенность поиска в том, что после поиска по какому-то Критерию из дальнейшего поиска исключаются сущности, найденные по этому критерию.
То есть алгоритм должен быть примерно таким:

var repository = new Repository();
var criteria_array = new Criteria[];
// заполнение массива Критериев
foreach (var criteria in criteria_array)
{
    var found_entities = repository.FindByCriteria(criteria);
    ...
    // исключаем найденные сущности из дальнейшего поиска
    ...
    // добавляем найденные сущности в отдельную кеш-таблицу, в которой есть дополнительная колонка "Критерий"
    // для каждой сущности запоминаем критерий, по которому была найдена эта сущность
    cashe_table.Add(found_entities, criteria);
}


Пример. Предположим, в БД есть юридическое лицо со следующими полями:
— "юридическое наименование" = "ООО Ромашка"
— "краткое название" = "Ромашка"
— "регион регистрации" = "Москва"
— "ИНН" = "11223344556600".
Это юридическое лицо может быть найдено по Критерию-1 и по Критерию-2.
Однако, нам нужно, чтобы после нахождения по Критерию-1, это юрлицо не попало в выборку по Критерию-2.
То есть, найденные юрлица исключаются из следующих поисков. То есть это постоянно "сужающийся" поиск.

Вопрос: как при поиске по следующему в массиве Критерию-(n) "отсечь" из результата поиска те сущности, которые были найдены при поиске по предыдущим Критериям?

Была мысль сделать это "топорно": читаем все сущности во временную таблицу, в которой есть поле-"флажок".
Поиск выполняем по этой временной таблице. И после поиска по каждому критерию для найденных сущностей "включаем" этот "флажок".
При поиске по каждому критерию добавляем в условия поиска кроме самого критерия дополнительное условие "флажок" = "выключен".

Но нам этот подход кажется сомнительным.

Посоветуйте плиз как сделать грамотно в русле разделения слоев и "чистой архитектуры".