Запрос определенного набора записей с помощью QueryExpression

Есть ли способ построить QueryExpression, возвращающий только определенный набор записей?

У меня есть следующие типы критериев:

First:
возвращает первые n записей (т. е. выбирает верхнюю)

Last:
Возвращает последние n записей.

Every:
Возвращает каждую n-ю запись.

Для типа «Первый» я могу использовать

queryExpression.TopCount = number_of_records

Но я понятия не имею, как я могу достичь других типов критериев. Проблема в том, что объемы данных довольно большие, и если мне нужно сначала получить все записи и запросить результат, например, с помощью Linq для настройки набора результатов, у меня, вероятно, возникнут проблемы с производительностью.

Если бы я мог построить QueryExpression, просто выбрав именно то, что мне нужно, все стало бы более эффективно.

Кто-нибудь знает, как добиться этого с помощью QueryExpression?

Речь идет о системе Microsoft Dynamics CRM Online.


person Martin Felber    schedule 12.07.2019    source источник
comment
Можете ли вы объяснить, почему вы хотите запрашивать каждую N-ю запись?   -  person Zach Mast    schedule 12.07.2019
comment
пользователю нужна возможность настроить количество возвращаемых данных. пользователь может определять запросы (fetchxml) в пользовательской форме. скажем, такой запрос возвращает ему › 50 тыс. записей. затем пользователь может разрешить механизму выбирать только подмножество полного набора результатов. таким образом, он может контролировать количество возвращаемых записей без необходимости изменять сам запрос, настроенный как fetchxml.   -  person Martin Felber    schedule 12.07.2019


Ответы (2)


Для «последнего N» вы можете изменить сортировку и снова использовать TopCount.

Для «каждого N-го» вы можете рассмотреть разбиение на страницы выражения запроса.

Скажем, вы ищете каждую 10-ю запись. Что я мог бы сделать, так это установить размер моей страницы на 10 (query.PageInfo.Count).

Чтобы как можно быстрее перебирать страницы, я бы заставил свой «основной» запрос возвращать только идентификаторы GUID. Когда я получаю новую страницу GUID, я беру первый GUID и получаю столбцы, которые мне нужны для этой записи, с помощью отдельного вызова Retrieve.

person Aron    schedule 12.07.2019
comment
спасибо за ваш отзыв .... правильно, обратная сортировка - это хороший момент :) у вас может быть пример, касающийся пейджинга? - person Martin Felber; 12.07.2019
comment
Пожалуйста. Ссылка из ответа содержит пример подкачки QueryExpression: docs.microsoft.com/en-us/powerapps/developer/ - person Aron; 12.07.2019

Последние N записей: довольно простой порядок по определенному полю в порядке убывания, а затем верхние N, вот и все. Возвращает последние n записей.

// Instantiate QueryExpression QEaccount
var QEaccount = new QueryExpression("account");
QEaccount.TopCount = 5;

// Add columns to QEaccount.ColumnSet
QEaccount.ColumnSet.AddColumns("name", "ah_account_type", "accountid");
QEaccount.AddOrder("name", OrderType.Descending);

Каждая n-я запись:

Есть ли у вас какие-либо конкретные критерии здесь, например, дайте мне все учетные записи, где страна = Германия, если да, то вы можете указать пользовательское условие для возврата определенного набора записей, как показано ниже.

// Define Condition Values
var QEaccount_address1_country = "Germany";

// Instantiate QueryExpression QEaccount
var QEaccount = new QueryExpression("account");

// Add columns to QEaccount.ColumnSet
QEaccount.ColumnSet.AddColumns("name", "ah_account_type", "accountid", "address1_country");

// Define filter QEaccount.Criteria
QEaccount.Criteria.AddCondition("address1_country", ConditionOperator.Equal, QEaccount_address1_country);
person AnkUser    schedule 12.07.2019