Здравствуйте, коллеги!
Сделал велосипед - перебор результирующей коллекции > элемента БП "Чтение данных" и решил поделиться для "будущих поколений".
Тестовый БП:
читаем счета
в Методах БП объявляем переменную, в которой будем хранить коллекцию, в данном случае invoices и методы доступа к колонкам объекта GetCompositeObjectColumnValue и перехода на следующую запись коллекции CompositeObjectListMoveNext
инициализируем переменную коллекции
Перебираем коллекцию и читаем поля текущей записи коллекции
Готово!
Какие тэги поставить, что бы в топе выдачи поиска по теме было?
Для статей при создании поста можно выбрать тип «Публикация» вместо «Вопрос».
По сути темы, таких масштабных чтений лучше избегать, ведь это требует большого объёма памяти как на сервере БД, так и на веб-сервере. Если действительно нужно обработать так много записей, лучше порциями.
Зверев Александр,
Точно! Поменял на публикацию. А теги какие добавить? Идея то востребованная, куча вопросов на эту тему...
Касательно количества записей я согласен, что не нужно большими кусками читать, надо выборку ограничивать. Только элемент "Чтение данных" не поможет в этом, изворачиваться придется.
Как на Хабре, тег #никто_не_читает_теги.
Можно читать первые N штук, а потом каждую обрабатывать, чтобы не попадали под условия выборки, затем читать очередные N штук. А если записи не меняются, то непонятно, зачем так много читать, а не фильтровать ещё на уровне запроса в базу.
Борис, Спасибо!
Очень помогли.
И как жаль, что до сих пор нет базового инструмента для работы с коллекциями и способа перевода в EntityCollection
Это же каким извращенцем нужно быть, чтоб кусок кода давать в виде скриншота) что ж вы за люди))))))
Stradivarius,
я посчитал, что он читается лучше, потому что вставленное как <код> тут выглядит ужасно
Methods
private IEnumerator<ICompositeObject> entities; private T GetCompositeObjectColumnValue<T>(IEnumerator<ICompositeObject> objectList, string columnName) { ICompositeObject currentObject = objectList.Current; if(currentObject != null) { currentObject.TryGetValue<T>(columnName, out T value); return value; } else { return default(T); } } private bool CompositeObjectListMoveNext(IEnumerator<ICompositeObject> objectList) { return objectList.MoveNext(); }
Init
entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList").GetEnumerator(); return true;
Processing
Set("MoveNext", CompositeObjectListMoveNext(entities)); string name = GetCompositeObjectColumnValue<string>(entities, "Name"); // Работает с Name return true;