Добрый день,
как преобразовать 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:
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
Здравствуйте Alik Bory. На email Вам была отправлена статья с описанием основных методов EntitySchemaQuery.
Добрый день Антон!
На Ваш e-mail были направлены материалы.
opisanie_osnovnyh_metodov_entityschemaquery.docx
С уважением,
Белецкий Арсений
Группа компаний Terrasoft
Екатерина, ответил Вам в теме:
http://www.community.terrasoft.ru/forum/topic/11184#comment-50360