СЭД «ДЕЛО»
Руководство пользователя
×

3.3 Поиск объектов

Для поиска объектов используется метод Search класса EntityHelper. Метод возвращает список сущностей, поэтому необходимо объявить переменную, в которую будет записан результат поиска. Если сущности не найдены, возвращается пустой список. Параметром метода являются запрос типа Query<T> или критерии поиска типа SearchArguments. Первый вариант с запросом является более удобным в использовании. Поиск объектов происходит по головным сущностям системы, в результат поиска загружаются головные сущности, без загрузки дочерних, т.к. подгрузка последних приводит к проблемам с производительностью.
Поиск с Query<T>
Для экземпляра класса Query<T> указывается тип искомого объекта. Критерии поиска задаются с использованием методов SetCriterion и TextCriterion.
Пример поиска объекта. Следующие три критерия задают поиск резолюции, которая имеет признак контрольной, относится к определённой РК, и дата которой находится в заданном диапазоне:
var q = new Query<RESOLUTION_Entity>();
q.SetCriterion(e => e.ISN_REF_DOC, RcEntity.ISN_DOC);
q.SetCriterion(e => e.CONTROL_STATE, 1);
q.SetCriterion(e => e.RESOLUTION_DATE, "01/01/2020:10/12/2021");
var result = q.Search();
Если предполагается загрузка большого количества данных, необходимо ограничивать количество записей для загрузки. Данные параметры указываются в поле SA запроса. Пример для загрузки 200 событий, со значением ISL_EVENT от value и больше, отсортированных по полю ISL_EVENT:
var q = new Query<EVNT_FEED_Entity>();
q.SetCriterion(ef => ef.ISL_EVENT, string.Format("{0}:null", value));
q.SA.OrderBy = "ISL_EVENT";
q.SA.StartRowIndex = 0;
q.SA.RecordsPerPage = 200;
var result = q.Search();
Вложенный поиск. Зачастую недостаточно указать критерии поиска со свойствами, соответствующими полям таблицы БД сущности, может понадобиться поиск по свойствам дочерних сущностей. Критерии вложенного поиска указываются в поле SA запроса. Рассмотрим пример поиска по доп. реквизитам для РК документов:
var q = new Query<DOC_RC_Entity>();
q.SetCriterion(e => e.DUE_DOCGROUP, "0.2TZ.2EZDG.");
q.SetCriterion(e => e.DOC_DATE, "01/05/2021:07/07/2021");
q.SA.Criteria["AR_RC_VALUE.end_dog"] = "1";
q.SA.Criteria["AR_RC_VALUE.sum_dog"] = "250000:350000";
q.SA.Criteria["AR_RC_VALUE.date_end"] = "08/07/2021";
q.SA.Criteria["ACQUAINTANCE.DUE_ADRESAT"] = "0.2SD.2SP.";
var docRcList = q.Search();
В данном примере поиск РК осуществляется по группе РК с идентификатором "0.2TZ.2EZDG. " и периоду создания РК с 1 мая 2021 года по 7 июля 2021 года. Вложенный поиск по доп. реквизитам (AR_RC_VALUE) содержит три критерия, end_dog – флаг закрытого договора, где 1 означает, что флаг взведен, sum_dog – сумма договора, от 250 000 до 350 000 и дата завершения договора 8 июля 2021 года. Вложенный поиск по журналу ознакомления содержит один критерий DUE_ADRESAT – идентификатор адресата, равный "0.2SD.2SP.". После выполнения поиска, поле docRcList содержит список сущностей РК документа типа DOC_RC_Entity или пустой список.
Поиск протоколов. Поиск протоколов производится по сущности FULL_PROT_Entity. Пример поиска записей протокола по изменениям определенной РК, отсортированный по времени, полю TIME_STAMP:
var q = new Query<FULL_PROT_Entity>(LoadMode.Table);
q.SA.OrderBy = "TIME_STAMP";
q.SetCriterion(p => p.TABLE_ID, "D");
q.SetCriterion(p => p.OPER_ID, "U");
q.SetCriterion(p => p.SUBOPER_ID, "U");
q.SetCriterion(p => p.REF_ISN, RcEntity.ISN_DOC);
var protocols = q.Search();
Поиск с SearchArguments
Критерии поиска задаются в виде экземпляра класса SearchArguments. Обязательно должно быть заполнено свойство Result данного класса, задающее объект, который нужно искать. Значение, задаваемое в этом свойстве должно быть строкой, соответствующей имени искомой сущности без суффикса "_Entity". После задания типа результата поиска, нужно задать критерии поиска.
Пример поиска объекта, аналогичный поиску по Query:
var sa = new SearchArguments();
sa.Result = "RESOLUTION";
sa.Criteria.Add("RESOLUTION.RESOLUTION.ISN_REF_DOC", RcEntity.ISN_DOC.ToString());
sa.Criteria.Add("RESOLUTION.RESOLUTION.CONTROL_STATE", "1");
sa.Criteria.Add("RESOLUTION.RESOLUTION.RESOLUTION_DATE", "01/01/2020:10/10/2021");
var resolutionListSA = EntityHelper.Search<RESOLUTION_Entity>(sa);
* Примечание. Рекомендуется использовать тип var при инициализации объектов, в связи с ожидаемой сменой типов идентификаторов.
Онлайн помощь создана в Dr.Explain