Добрый день,
как преобразовать SQL запрос на EntitySchemaQuery
пример SQL
(SELECT count(*) FROM "Activity" b
WHERE "TypeId" = '{FBE0ACDC-CFC0-DF11-B00F-001D60E938C6}'AND b."OwnerId" = a."OwnerId") a,
(SELECT count(*) FROM "Activity" c
WHERE "TypeId" = '{E1831DEC-CFC0-DF11-B00F-001D60E938C6}'AND c."OwnerId" = a."OwnerId") b,
(SELECT count(*) FROM "Activity" c
WHERE "TypeId" = '{E2831DEC-CFC0-DF11-B00F-001D60E938C6}'AND c."OwnerId" = a."OwnerId") c
FROM "Activity" a WHERE a."Id" IS NOT NULL
GROUP BY "OwnerId"
Нравится
Здравствуйте Alik Bory,
к сожалению, существующий функционал EntitySchemaQuery не покрывает требования вашего запроса. Необходимые расширения функционала уже запланированы в следующей версии BPMonline.
Для получения списка entity по вашему запросу можно использовать следующий код в котором используется более низкоуровневый класс Select и установка прав с использованием класса DBSecurityEngine:
[csharp]
var securityEngine = UserConnection.DBSecurityEngine;
//Создание объекта данных для построения подзапроса на проверку прав доступа текущего пользователя
var options = new RecordsByRightOptions() {
RightEntitySchemaName = securityEngine.GetRecordRightsSchemaName("Activity"), // Имя таблицы прав
PrimaryColumnName = "Id", // Имя главной колонки таблицы
RecordRightColumnName = "CanRead", // Имя колонки отвечающей за права чтения данных
UserId = UserConnection.CurrentUser.Id // Идентификатор текущего пользователя
};
options.EntitySchemaSourceAlias = "Activity"; // Указание Alias базовой таблицы
// Построение подзапроса проверки прав для базового запроса
var condition = securityEngine.GetRecordsByRightCondition(options);
condition.LogicalOperation = LogicalOperation.And;
options.EntitySchemaSourceAlias = "SubActivity"; // Указание Alias таблицы подзапроса получение количеста Активностей по типу
// Построение подзапроса проверки прав для подзапросов получения количества Активностей по типу
var innerSelectCondition = securityEngine.GetRecordsByRightCondition(options);
innerSelectCondition.LogicalOperation = LogicalOperation.And;
// Построение подзапроса получающего количество Активностей с типом Задача
var selectSubQuery1 = new Select(UserConnection)
.Column(Func.Count(Column.Asterisk()))
.From("Activity").As("SubActivity")
.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{FBE0ACDC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery1.Condition.Add(innerSelectCondition);
// Построение подзапроса получающего количество Активностей с типом Звонок
var selectSubQuery2 = new Select(UserConnection)
.Column(Func.Count(Column.Asterisk()))
.From("Activity").As("SubActivity")
.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{E1831DEC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery2.Condition.Add(innerSelectCondition);
// Построение подзапроса получающего количество Активностей с типом E-mail
var selectSubQuery3 = new Select(UserConnection)
.Column(Func.Count(Column.Asterisk()))
.From("Activity").As("SubActivity")
.Where("SubActivity", "OwnerId").IsEqual("Activity", "OwnerId")
.And("SubActivity", "TypeId").IsEqual(Column.Parameter("{E2831DEC-CFC0-DF11-B00F-001D60E938C6}")) as Select;
selectSubQuery3.Condition.Add(innerSelectCondition);
// Построение основного запроса
var selectQuery = new Select(UserConnection)
.Column("OwnerId")
.Column(Func.Count("OwnerId")).As("abc")
.Column(selectSubQuery1).As("a")
.Column(selectSubQuery2).As("b")
.Column(selectSubQuery3).As("c")
.From("Activity")
.Where("Id").Not().IsNull()
.GroupBy("OwnerId") as Select;
selectQuery.Condition.Add(condition);
// Получение списка entity по построеному запросу
var entityCollection = new EntityCollection(UserConnection, "Activity");
entityCollection.Load(selectQuery.ExecuteReader(UserConnection.EnsureDBConnection()));
// После выполнения функции Load в списке entityCollection содержаться все обработанные записи из таблицы Activity к которым текущий пользователь имеет доступ.
// Каждая из записей состоит из 4-х колонок - OwnerId, abc, a, b, c
[/csharp]
Здравствуйте Alik Bory. На email Вам была отправлена статья с описанием основных методов EntitySchemaQuery.
Добрый день Антон!
На Ваш e-mail были направлены материалы.
opisanie_osnovnyh_metodov_entityschemaquery.docx
С уважением,
Белецкий Арсений
Группа компаний Terrasoft
Екатерина, ответил Вам в теме:
http://www.community.terrasoft.ru/forum/topic/11184#comment-50360