Отфильтровать записи раздела

Сложный

Пример. Создать консольное приложение, которое, используя класс SelectQuery, прочитает записи раздела Контакты (Contacts). Отобразить колонки:

  • Id.
  • ФИО (Name).
  • Количество активностей (ActivitiesCount) — агрегирующая колонка, отображающая количество активностей данного контакта.

Отфильтровать данные таким образом, чтобы были прочитаны только те контакты, у которых количество активностей находится в диапазоне от 1 до 3, а значение колонки ФИО (Name) начинается с символа "Ч".

Реализовать фильтры 

Предварительно выполните пример чтения записей в стороннем приложении, описанный в статье Добавить кнопку для чтения записей раздела [Контакты].

Результат реализации экземпляра класса запроса на чтение записей в сокращенной форме представлен ниже.

SelectQuery()
/* Экземпляр класса запроса. */
var selectQuery = new SelectQuery()
{
    /* Название корневой схемы. */
    RootSchemaName = "Contact",
    /* Добавление колонок в запрос. */
    Columns = new SelectQueryColumns()
    {
        /* Коллекция колонок. */
        Items = new Dictionary<string, SelectQueryColumn>()
        {
            /* Колонка [ФИО]. */
            {
                /* Ключ. */
                "Name",
                /* Значение. */
                new SelectQueryColumn()
                {
                    /* Выражение, задающее тип колонки. */
                    Expression = new ColumnExpression()
                    {
                        /* Тип выражения — колонка схемы. */
                        ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
                        /* Путь к колонке. */
                        ColumnPath = "Name"
                    }
                }
            },
            /* Колонка [Количество активностей]. */
            {
                "ActivitiesCount",
                new SelectQueryColumn()
                {
                    Expression = new ColumnExpression()
                    {
                        /* Тип выражения — вложенный запрос. */
                        ExpressionType = EntitySchemaQueryExpressionType.SubQuery,
                        /* Путь к колонке относительно корневой схемы. */
                        ColumnPath = "[Activity:Contact].Id",
                        /* Тип функции — агрегирующая. */
                        FunctionType = FunctionType.Aggregation,
                        /* Тип агрегации — количество. */
                        AggregationType = AggregationType.Count
                    }
                }
            }
        }
    }
};

Чтобы реализовать фильтры:

  1. Создайте экземпляр класса коллекции фильтров Filters.
  2. Заполните необходимые свойства значениями.
  3. В свойство Filters экзепляра класса запроса, созданного на предыдущем шаге, передайте ссылку на этот экземпляр.
    Пример реализации класса коллекции фильтров
    /* Фильтры запроса. */
    var selectFilters = new Filters()
    {
        /* Тип фильтра — группа. */
        FilterType = Terrasoft.Nui.ServiceModel.DataContract.FilterType.FilterGroup,
        /* Коллекция фильтров. */
        Items = new Dictionary<string, Filter>
        {
            /* Реализация фильтров. */
        }
    };
    /* Добавление фильтров в запрос. */
    selectQuery.Filters = selectFilters;
    /* Сериализация экземпляра класса запроса на чтение в JSON-строку. */
    var json = new JavaScriptSerializer().Serialize(selectQuery);
    

    Свойство Items должно содержать коллекцию типа "ключ-значение". В качестве ключа указывается строка, содержащая название фильтра, а в качестве значения — экземпляр класса Filters, содержащий непосредственную реализацию фильтра.

  4. Реализуйте фильтр, обеспечивающий выбор только тех контактов, у которых количество активностей попадает в диапазон от 1 до 3. Для этого добавьте экземпляр в коллекцию фильтров.
    Пример нового экземпляра коллекции фильтров
    /* Фильтрация по активностям. */
    {
        /* Ключ. */
        "FilterActivities",
        /* Значение. */
        new Filter
        {
            /* Тип фильтра — фильтр диапазона. */
            FilterType = Terrasoft.Nui.ServiceModel.DataContract.FilterType.Between,
            /* Тип сравнения — диапазон. */
            ComparisonType = FilterComparisonType.Between,
            /* Выражение, подлежащее проверке. */
            LeftExpression = new BaseExpression()
            {
                /* Тип выражения — вложенный запрос. */
                ExpressionType = EntitySchemaQueryExpressionType.SubQuery,
                /* Путь к колонке относительно корневой схемы. */
                ColumnPath = "[Activity:Contact].Id",
                /* Тип функции — агрегирующая. */
                FunctionType = FunctionType.Aggregation,
                /* Тип агрегации — количество. */
                AggregationType = AggregationType.Count
            },
            /* Конечное выражение диапазона фильтрации. */
            RightGreaterExpression = new BaseExpression()
            {
                /* Тип выражения — параметр. */
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                /* Параметр выражения. */
                Parameter = new Parameter()
                {
                    /* Тип данных параметра — целое число. */
                    DataValueType = DataValueType.Integer,
                    /* Значение параметра. */
                    Value = 3
                }
            },
            /* Начальное выражение диапазона фильтрации. */
            RightLessExpression = new BaseExpression()
            {
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                Parameter = new Parameter()
                {
                    DataValueType = DataValueType.Integer,
                    Value = 1
                }
            }
        }
    }
    
  5. Реализуйте фильтр, обеспечивающий выбор только тех контактов, у которых значение колонки ФИО (Name) начинается с символа "Ч". Для этого добавьте экземпляр в коллекцию фильтров.
    Пример нового экземпляра коллекции фильтров
    /* Фильтрация по имени. */
    {
        /* Ключ. */
        "FilterName",
        /* Значение. */
        new Filter
        {
            /* Тип фильтра — фильтр сравнения. */
            FilterType = Terrasoft.Nui.ServiceModel.DataContract.FilterType.CompareFilter,
            /* Тип сравнения — начинается выражением. */
            ComparisonType = FilterComparisonType.StartWith,
            /* Выражение, подлежащее проверке. */
            LeftExpression = new BaseExpression()
            {
                /* Тип выражения — колонка схемы. */
                ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
                /* Путь к колонке. */
                ColumnPath = "Name"
            },
            /* Выражение фильтрации. */
            RightExpression = new BaseExpression()
            {
                /* Тип выражения — параметр. */
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                /* Параметр выражения. */
                Parameter = new Parameter()
                {
                    /* Тип данных параметра — текст. */
                    DataValueType = DataValueType.Text,
                    /* Значение параметра. */
                    Value = "Ч"
                }
            }
        }
    }