Здравствуйте!
Есть небольшая программа. Сделана в целом по принципам "внедрения зависимостей" и "чистой архитектуры".
Что надо сделать.
Бизнес-операция (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);
}
process_list = cashe_table.GetAll();
foreach (var entity in process_list)
{
if (entity.search_criteria.dostovernost = 1)
algorithm1(entity);
elseif (entity.search_criteria.dostovernost = 2)
algorithm2(entity);
....
}
Пример. Предположим, в БД есть юридическое лицо со следующими полями:
— "юридическое наименование" = "ООО Ромашка"
— "краткое название" = "Ромашка"
— "регион регистрации" = "Москва"
— "ИНН" = "11223344556600".
Это юридическое лицо может быть найдено по Критерию-1 и по Критерию-2.
Однако, нам нужно, чтобы после нахождения по Критерию-1, это юрлицо не попало в выборку по Критерию-2.
То есть, найденные юрлица исключаются из следующих поисков. То есть это постоянно "сужающийся" поиск.
Объясню зачем нужен такой "сложный" поиск.
Грубо — в зависимости от того критерия, по которому отобраны сущности, выполняются разные обработки над выборками.
У каждого критерия есть признак "вес достоверности".
Например, самый "достоверный" — это Критреий-1. Юрлица, найденные по этому критерию являются "достоверными" и они обрабатываются по одному алгоритму.
Юрлица, найденные по следующему критерию, менее достоверные, их надо обрабатывать по алгоритму-2. И т.д.
Проблема в том, что результаты поиска по каждому критерию пересекающиеся.
То есть одно и тоже юрлицо может попасть в выборку и по Критерию-1 и по Критерию-2 и по другим Критериям.
Но обработано юрлицо должно быть по наиболее "достоверному" Критерию и соответствующему алгоритму.
То есть, если юрлицо попало в выборку по более "достоверному" Критерию-1, то оно должно быть обработано по Алгоритму-1. Нет смысла рассматривать это юрлицо по другим Критериям. Поэтому из поиска по другим Критериям это юрлицо надо как-то исключить.
Вопрос: как при поиске по следующему в массиве Критерию-(n) "отсечь" из результата поиска те сущности, которые были найдены при поиске по предыдущим Критериям?
Была мысль сделать это "топорно": сначала читаем все сущности во временную таблицу, в которой есть поле-"флажок".
Поиск по Критериям выполняем по этой временной таблице. И после поиска по каждому Критерию для найденных сущностей "включаем" этот "флажок".
При поиске по каждому критерию добавляем в условия поиска кроме самого критерия дополнительное условие "флажок" = "выключен".
Но нам этот подход кажется сомнительным.
Посоветуйте плиз как сделать грамотно в русле разделения слоев и "чистой архитектуры".