Вопрос

Сравнить id с коллекцией id , возможно ли в БП ?

Доброго времени суток , Возможно ли в БП одним элементом "Читать данные" c режимом читать коллекцию записей отбирая одно поле к примеру "Id"  и  в другом элементе  сравнить  Id с коллекцией Id ранее полученных ? Имеется ли вообще какой ниб тип сравнивания с коллекцией значений ?

У меня такой же вопрос

5 комментариев
Лучший ответ

Сравнения с коллекцией с помощью встроенных элементов, насколько я знаю, не существует. Вместе с тем, вы можете:
1. Передать коллекцию в скрипт-таск (задание-сценарий) и сделать поиск вашего id там.
2. Искать ваш id циклом - т.е. не читать коллекцию записей сразу, а каждую запись по очереди. После прочтения каждой записи изменяете какое-нибудь подходящее для этого поле (я часто грешу и ставлю текущую дату в поле "Дата изменения", а в условиях выборки ставлю сортировку по дате изменения по возрастанию) - таким образом перебираете всю выборку и находите искомую запись по id.
3. Если речь идет об id в одном и том же объекте, и вам нужно просто обнаружить факт наличия id в выборке, то вам может быть достаточно посчитать количество записей, соответствующих этому id или просто проверить результат выборки по искомому id на Guid.Empty.

Сравнения с коллекцией с помощью встроенных элементов, насколько я знаю, не существует. Вместе с тем, вы можете:
1. Передать коллекцию в скрипт-таск (задание-сценарий) и сделать поиск вашего id там.
2. Искать ваш id циклом - т.е. не читать коллекцию записей сразу, а каждую запись по очереди. После прочтения каждой записи изменяете какое-нибудь подходящее для этого поле (я часто грешу и ставлю текущую дату в поле "Дата изменения", а в условиях выборки ставлю сортировку по дате изменения по возрастанию) - таким образом перебираете всю выборку и находите искомую запись по id.
3. Если речь идет об id в одном и том же объекте, и вам нужно просто обнаружить факт наличия id в выборке, то вам может быть достаточно посчитать количество записей, соответствующих этому id или просто проверить результат выборки по искомому id на Guid.Empty.

А почему бы просто в элементе чтения данных не отфильтровать дополнительно записи по значению поля, равному интересующему Id? Так не будет необходимости загружать лишние данные и сразу будет видно, есть результаты или выборка пустая.

Или же Вы хотите сравнивать коллекцию с коллекцией? Тогда придётся скриптами, и то, лучше не делать выборки отдельно, а сконструировать более сложный Select, выбирающий за раз нужное.

Ксензов Егор,

1-ый метод подходит но не такой удобный как хотелось бы).

2-ой метод я вообще молчу, ну скажем так для больших данных врядли подойдет.

3-ий метод не совсем понял как именно предлагаете , ( мой пример , к примеру одним запросом я получаю список контактов которые входят в опр деталь , и для этих N контактов хочу изменить права доступа на опр объект)

 

Зверев Александр,

 

мне нужно select * where id_Contact  in (select id_Contact from Detail where Date > '02022019')  Это я сейчас утрируя написал естественно , средствами БП можно это сделать ?

В скрипте БП можно использовать класс Select (или Update, Delete). Все они умеют вызывать подзапросы с In:

var existsInBonusesDeduction = new Select(userConnection)
 .Column(Func.Count("Id"))
 .From("BonusesDeduction")
 .Where("ChargeTransactionId")
  .In(new Select(userConnection)
    .Column("Id")
    .From("Transaction")
    .Where("PurchaseId")
     .IsEqual(Column.Parameter(purchaseId))
    .And("TypeId")
     .IsEqual(Column.Parameter(TransactionConsts.RecordTypeUId))
    .And("StatusId")
     .IsEqual(Column.Parameter(TransactionConsts.CompletedStatusUId))
  ) as Select;
var existsInBonusesDeductionResult = existsInBonusesDeduction.ExecuteScalar<int>(dbExecutor);

 

Войдите или зарегистрируйтесь, чтобы комментировать