Надо преобразовать SQL запрос на EntitySchemaQuery

Добрый день,
как преобразовать SQL запрос на EntitySchemaQuery
пример SQL

SELECT "OwnerId",count("OwnerId") abc,

(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"

Нравится

7 комментариев

Здравствуйте 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

Спасибо, Andrii Derkach.
У нас при разработке отчета возникают много вопросов. Единственная справка это библиотека VS, которого просто трудно без справочника. У вас имеются ли справки по EntitySchema,примеры?
Спасибо

Здравствуйте Alik Bory. На email Вам была отправлена статья с описанием основных методов EntitySchemaQuery.

Добрый день!
А можете мне тоже выслать статью?

Добрый день Антон!

На Ваш e-mail были направлены материалы.
opisanie_osnovnyh_metodov_entityschemaquery.docx

С уважением,
Белецкий Арсений
Группа компаний Terrasoft

А возможно ли в EntitySchemaQuery написать order?

Екатерина, ответил Вам в теме:
http://www.community.terrasoft.ru/forum/topic/11184#comment-50360

Показать все комментарии