Получение информации из базы данных. Класс Select
Glossary Item Box
Общие сведения
Класс Terrasoft.Core.DB.Select предназначен для построения запросов выборки записей из таблиц базы данных. В результате создания и конфигурирования экземпляра этого класса будет построен запрос в базу данных приложения в виде SQL-выражения SELECT. В запрос можно добавить требуемые колонки, фильтры и условия ограничений. Результаты выполнения запроса возвращаются в виде экземпляра, реализующего интерфейс System.Data.IDataReader, либо скалярного значения требуемого типа.
ВАЖНО
При работе с классом Select не учитываются права доступа пользователя, использующего текущее соединение. Доступны абсолютно все записи из базы данных приложения. Также не учитываются данные, помещенные в хранилище кэша (см. "Рекомендации по использованию различных типов хранилищ"). Если необходимы дополнительные возможности по управлению правами доступа и работе с хранилищем кэша bpm'online, следует использовать класс EntitySchemaQuery.
Класс Terrasoft.Core.DB.Select
ВАЖНО
НА ЗАМЕТКУ
Полный перечень методов и свойств класса Select, его родительских классов, а также реализуемых им интерфейсов можно найти в документации ".NET библиотеки классов ядра платформы".
Конструкторы
- public Select(UserConnection userConnection) — создает экземпляр класса с указанным UserConnection.
- public Select(UserConnection userConnection, CancellationToken cancellationToken) — создает экземпляр класса с указанным UserConnection и токеном отмены выполнения управляемого потока.
- public Select(Select source) — создает экземпляр класса, являющийся клоном экземпляра, переданного в качестве аргумента.
Свойства
Табл. 1. — Основные свойства класса Select
Свойство | Тип | Описание |
---|---|---|
UserConnection | Terrasoft.Core.UserConnection | Пользовательское подключение, используемое при выполнении запроса. |
RowCount | int | Количество записей, которые вернет запрос после выполнения. |
Parameters | Terrasoft.Core.DB.QueryParameterCollection | Коллекция параметров запроса. |
HasParameters | bool | Определяет наличие параметров у запроса. |
BuildParametersAsValue | bool | Определяет, добавлять ли параметры запроса в текст запроса как значения. |
Joins | Terrasoft.Core.DB.JoinCollection | Коллекция выражений Join в запросе. |
HasJoins | bool | Определяет наличие выражений Join в запросе. |
Condition | Terrasoft.Core.DB.QueryCondition | Условие выражения Where запроса. |
HasCondition | bool | Определяет наличие выражения Where в запросе. |
HavingCondition | Terrasoft.Core.DB.QueryCondition | Условие выражения Having запроса. |
HasHavingCondition | bool | Определяет наличие выражения Having в запросе. |
OrderByItems | Terrasoft.Core.DB.OrderByItemCollection | Коллекция выражений, по которым выполняется сортировка результатов запроса. |
HasOrderByItems | bool | Определяет наличие условий сортировки результатов запроса. |
GroupByItems | Terrasoft.Core.DB.QueryColumnExpressionCollection | Коллекция выражений, по которым выполняется группировка результатов запроса. |
HasGroupByItems | bool | Определяет наличие условий группировки результатов запроса. |
IsDistinct |
bool | Определяет, должен ли запрос возвращать только уникальные записи. |
Columns | Terrasoft.Core.DB.QueryColumnExpressionCollection | Коллекция выражений колонок запроса. |
OffsetFetchPaging | bool | Определяет возможность постраничного возврата результата запроса. |
RowsOffset | int | Количество строк, которые необходимо пропустить при возврате результата запроса. |
QueryKind | Terrasoft.Common.QueryKind | Тип запроса (см. "Отдельный пул запросов"). |
Методы
Табл. 2. — Основные методы класса Select
Методы | Описание |
---|---|
string GetSqlText() | Возвращает SQL-текст запроса. |
void BuildSqlText(StringBuilder sb) | Формирует текст запроса при помощи экземпляра StringBuilder. |
void ResetCachedSqlText() | Очищает закэшированный текст запроса. |
QueryParameterCollection GetUsingParameters() | Возвращает коллекцию параметров, используемых запросом. |
void ResetParameters() | Очищает коллекцию параметров запроса. |
QueryParameterCollection InitializeParameters() |
Инициализирует коллекцию параметров запроса. |
IDataReader ExecuteReader(DBExecutor dbExecutor) |
Выполняет запрос, используя экземпляр DBExecutor. Возвращает объект, реализующий интерфейс IDataReader. |
IDataReader ExecuteReader(DBExecutor dbExecutor, CommandBehavior behavior) |
Выполняет запрос, используя экземпляр DBExecutor. Возвращает объект, реализующий интерфейс IDataReader. Параметр behavior предоставляет описание результатов запроса и их эффект на базу данных. |
void ExecuteReader(ExecuteReaderReadMethod readMethod) | Выполняет запрос, вызывая переданный метод делегата ExecuteReaderReadMethod для каждой записи результирующего набора. |
TResult ExecuteScalar<TResult>() | Выполняет запрос. Возвращает типизированный первый столбец первой записи результирующего набора. |
TResult ExecuteScalar<TResult>(DBExecutor dbExecutor) | Выполняет запрос, используя экземпляр DBExecutor. Возвращает типизированный первый столбец первой записи результирующего набора. |
Select Distinct() | Добавляет к SQL-запросу ключевое слово DISTINCT. Исключает дублирование записей в результирующем наборе. Возвращает экземпляр запроса. |
Select Top(int rowCount) | Устанавливает количество записей, возвращаемых в результирующем наборе. При этом меняется значение свойства RowCount (см. табл. 1). Возвращает экземпляр запроса. |
Select As(string alias) | Добавляет указанный в аргументе псевдоним для последнего выражения запроса. Возвращает экземпляр запроса. |
Select Column(string sourceColumnAlias) Select Column(string sourceAlias, string sourceColumnAlias) Select Column(Select subSelect) Select Column(Query subSelectQuery) Select Column(QueryCase queryCase) Select Column(QueryParameter queryParameter) Select Column(QueryColumnExpression columnExpression) |
Добавляет выражение, подзапрос или параметр в коллекцию выражений колонок запроса. Возвращает экземпляр запроса. Параметры:
|
Select From(string schemaName) Select From(Select subSelect) Select From(Query subSelectQuery) Select From(QuerySourceExpression sourceExpression) |
Добавляет в запрос источник данных. Возвращает экземпляр запроса. Параметры:
|
Join Join(JoinType joinType, string schemaName) Join Join(JoinType joinType, Select subSelect) Join Join(JoinType joinType, Query subSelectQuery) Join Join(JoinType joinType, QuerySourceExpression sourceExpression) |
Присоединяет к текущему запросу схему, подзапрос или выражение. Параметры:
|
QueryCondition Where() QueryCondition Where(string sourceColumnAlias) QueryCondition Where(string sourceAlias, string sourceColumnAlias) QueryCondition Where(Select subSelect) QueryCondition Where(Query subSelectQuery) QueryCondition Where(QueryColumnExpression columnExpression) Query Where(QueryCondition condition) |
Добавляет к текущему запросу начальное условие. Параметры:
|
QueryCondition And() QueryCondition And(string sourceColumnAlias) QueryCondition And(string sourceAlias, string sourceColumnAlias) QueryCondition And(Select subSelect) QueryCondition And(Query subSelectQuery) QueryCondition And(QueryParameter parameter) QueryCondition And(QueryColumnExpression columnExpression) Query And(QueryCondition condition) |
К текущему условию запроса добавляет условие (предикат), используя логическую операцию И. Параметры:
|
QueryCondition Or() QueryCondition Or(string sourceColumnAlias) QueryCondition Or(string sourceAlias, string sourceColumnAlias) QueryCondition Or(Select subSelect) QueryCondition Or(Query subSelectQuery) QueryCondition Or(QueryParameter parameter) QueryCondition Or(QueryColumnExpression columnExpression) Query Or(QueryCondition condition) |
К текущему условию запроса добавляет условие (предикат), используя логическую операцию ИЛИ. Параметры:
|
Query OrderBy(OrderDirectionStrict direction, string sourceColumnAlias) Query OrderBy(OrderDirectionStrict direction, string sourceAlias, string sourceColumnAlias) Query OrderBy(OrderDirectionStrict direction, QueryFunction queryFunction) Query OrderBy(OrderDirectionStrict direction, Select subSelect) Query OrderBy(OrderDirectionStrict direction, Query subSelectQuery) Query OrderBy(OrderDirectionStrict direction, QueryColumnExpression columnExpression) |
Выполняет сортировку результатов запроса. Возвращает экземпляр запроса. Параметры:
|
Query OrderByAsc(string sourceColumnAlias) Query OrderByAsc(string sourceAlias, string sourceColumnAlias) Query OrderByAsc(Select subSelect) Query OrderByAsc(Query subSelectQuery) Query OrderByAsc(QueryColumnExpression columnExpression) |
Выполняет сортировку результатов запроса в порядке возрастания. Возвращает экземпляр запроса. Параметры:
|
Query OrderByDesc(string sourceColumnAlias) Query OrderByDesc(string sourceAlias, string sourceColumnAlias) Query OrderByDesc(Select subSelect) Query OrderByDesc(Query subSelectQuery) Query OrderByDesc(QueryColumnExpression columnExpression) |
Выполняет сортировку результатов запроса в порядке убывания. Возвращает экземпляр запроса. Параметры:
|
Query GroupBy(string sourceColumnAlias) Query GroupBy(string sourceAlias, string sourceColumnAlias) Query GroupBy(QueryColumnExpression columnExpression) |
Выполняет группировку результатов запроса. Возвращает экземпляр запроса. Параметры:
|
QueryCondition Having() QueryCondition Having(string sourceColumnAlias) QueryCondition Having(string sourceAlias, string sourceColumnAlias) QueryCondition Having(Select subSelect) QueryCondition Having(Query subSelectQuery) QueryCondition Having(QueryParameter parameter) QueryCondition Having(QueryColumnExpression columnExpression) |
Добавляет в текущий запрос групповое условие. Возвращает экземпляр Terrasoft.Core.DB.QueryCondition, представляющий групповое условие для параметра запроса. Параметры:
|
Query Union(Select unionSelect) Query Union(Query unionSelectQuery) |
Объединяет результаты переданного запроса с результатами текущего запроса, исключая дубликаты из результирующего набора. Параметры:
|
Query UnionAll(Select unionSelect) Query UnionAll(Query unionSelectQuery) |
Объединяет результаты переданного запроса с результатами текущего запроса. Дубликаты из результирующего набора не исключаются. Параметры:
|
Табл. 3. — Типы присоединений (перечисление Terrasoft.Core.DB.JoinType)
Тип присоединения | Описание |
---|---|
Inner | Внутреннее соединение. |
LeftOuter | Левое внешнее соединение. |
RightOuter | Правое внешнее соединение. |
FullOuter | Полное соединение. |
Cross | Перекрестное соединение. |
Примеры использования
Пакет с конфигурационным веб-сервисом, реализующим приведенные ниже примеры, можно скачать по ссылке.
Метод обработки результатов запроса, используемый во всех примерах:
private string CreateJson(IDataReader dataReader) { var list = new List<dynamic>(); var cnt = dataReader.FieldCount; var fields = new List<string>(); for (int i = 0; i < cnt; i++) { fields.Add(dataReader.GetName(i)); } while (dataReader.Read()) { dynamic exo = new System.Dynamic.ExpandoObject(); foreach (var field in fields) { ((IDictionary<String, Object>)exo).Add(field, dataReader.GetColumnValue(field)); } list.Add(exo); } return JsonConvert.SerializeObject(list); }
Пример 1
Получить текст SQL запроса.
public string GetSqlTextExample() { var result = ""; var sel = new Select(UserConnection) .Column(Column.Asterisk()) .From("Contact"); result = sel.GetSqlText(); return result; }
Пример 2
Выбрать необходимое количество записей из требуемой таблицы (схемы объекта).
public string SelectColumns(string tableName, int top) { top = top > 0 ? top : 1; var result = "{}"; var sel = new Select(UserConnection) .Top(top) .Column(Column.Asterisk()) .From(tableName); using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 3
Выбрать идентификатор, имя и дату рождения контактов, дата рождения которых позже требуемого года.
public string SelectContactsYoungerThan(string birthYear) { var result = "{}"; var year = DateTime.ParseExact(birthYear, "yyyy", CultureInfo.InvariantCulture); var sel = new Select(UserConnection) .Column("Id") .Column("Name") .Column("BirthDate") .From("Contact") .Where("BirthDate").IsGreater(Column.Parameter(year)) .Or("BirthDate").IsNull() .OrderByDesc("BirthDate") as Select; using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 4
Выбрать идентификатор, имя и дату рождения контактов, дата рождения которых позже заданного года и у которых указан контрагент.
public string SelectContactsYoungerThanAndHasAccountId(string birthYear) { var result = "{}"; var year = DateTime.ParseExact(birthYear, "yyyy", CultureInfo.InvariantCulture); var sel = new Select(UserConnection) .Column("Id") .Column("Name") .Column("BirthDate") .From("Contact") .Where() .OpenBlock("BirthDate").IsGreater(Column.Parameter(year)) .Or("BirthDate").IsNull() .CloseBlock() .And("AccountId").Not().IsNull() .OrderByDesc("BirthDate") as Select; using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 5
Выбрать идентификатор и имя всех контактов, присоединив к ним идентификаторы и названия соответствующих контрагентов.
public string SelectContactsJoinAccount() { var result = "{}"; var sel = new Select(UserConnection) .Column("Contact", "Id").As("ContactId") .Column("Contact", "Name").As("ContactName") .Column("Account", "Id").As("AccountId") .Column("Account", "Name").As("AccountName") .From("Contact") .Join(JoinType.Inner, "Account") .On("Contact", "Id").IsEqual("Account", "PrimaryContactId") as Select; using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 6
Выбрать идентификатор и имя контактов, являющихся основными для контрагентов.
public string SelectAccountPrimaryContacts() { var result = "{}"; var sel = new Select(UserConnection) .Column("Id") .Column("Name") .From("Contact").As("C") .Where() .Exists(new Select(UserConnection) .Column("A", "PrimaryContactId") .From("Account").As("A") .Where("A", "PrimaryContactId").IsEqual("C", "Id")) as Select; using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 7
Выбрать страны и количество городов в стране, если количество городов больше указанного.
public string SelectCountriesWithCitiesCount(int count) { var result = "{}"; var sel = new Select(UserConnection) .Column(Func.Count("City", "Id")).As("CitiesCount") .Column("Country", "Name").As("CountryName") .From("City") .Join(JoinType.Inner, "Country") .On("City", "CountryId").IsEqual("Country", "Id") .GroupBy("Country", "Name") .Having(Func.Count("City", "Id")).IsGreater(Column.Const(count)) .OrderByDesc("CitiesCount") as Select; using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { result = CreateJson(dataReader); } } return result; }
Пример 8
Получить идентификатор контакта по его имени.
public string SelectCountryIdByCityName(string CityName) { var result = ""; var sel = new Select(UserConnection) .Column("CountryId") .From("City") .Where("Name").IsEqual(Column.Parameter(CityName)) as Select; result = sel.ExecuteScalar<Guid>().ToString(); return result; }