Вопрос

Написать запрос ESQ на серверной стороне

Добрый день!

Подскажите, пожалуйста, как реализовать данный ESQ запрос:

select c.Id, c.Name, count(1) as AmountOfLeadHandled
from Lead l inner join Contact c on c.Id=l.OwnerId 
where exists (select 1 from Activity a
	where a.LeadId=l.id
	and not (a.TypeId='E2831DEC-CFC0-DF11-B00F-001D60E938C6' 
		and a.MessageTypeId='7F9D1F86-F36B-1410-068C-20CF30B39373')
	and a.StatusId in ('4BDBB88F-58E6-DF11-971B-001D60E938C6'))
	Group by c.Id, c.Name

Есть такой код:

var schema = _userConnection.EntitySchemaManager.GetInstanceByName("Lead");
EntitySchemaQuery esqTotal = new EntitySchemaQuery(schema);
esqTotal.AddColumn("=Owner.Id");
esqTotal.AddColumn("=Owner.Name");
esqTotal.AddColumn(esqTotal.CreateAggregationFunction(Terrasoft.Common.AggregationTypeStrict.Count, "Id"));
var activityTypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");
var activitymessageTypeId = new Guid("7F9D1F86-F36B-1410-068C-20CF30B39373");
var activityStatusId = new Guid("4BDBB88F-58E6-DF11-971B-001D60E938C6");
var esqActivity = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity");
esqActivity.AddColumn("Lead");
var filtersByExisting = new EntitySchemaQueryFilterCollection(esqActivity);
filtersByExisting.IsNot = true;
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", activityTypeId));
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                 "MessageType", activitymessageTypeId));
esqActivity.Filters.Add(filtersByExisting);
esqActivity.Filters.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                "Status", activityStatusId));
esqTotal.Filters.Add(esqTotal.CreateFilter(FilterComparisonType.Exists, "Id", esqActivity));

Но он выдает не совсем то что надо. Мне надо выполнить условие:  

where a.LeadId=l.id

Не могу ни как добиться результата. Может кто нибудь подсказать?

Нравится

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

Добрый день!

 

Возможно, для решения Вашей задачи подойдет вариант с созданием представления в базе данных, потом для него в конфигурации создать схему и использовать эту схему для построения запроса и получения нужной информации.

В любой непонятной ситуации советуй view.wink

Руслан, а с чем связано требование именно при помощи ESQ?

На сервере есть класс Select, покрывающий почти все возможности его синтаксиса.

И смотрю на Ваш запрос, его точно ли нельзя «вывернуть», чтобы выборка шла из Activity, с join остальных таблиц без всяких exists? Как тут.

Зверев Александр пишет:

В любой непонятной ситуации советуй view.

Точно) Дешево и сердито... 

 

Ну, а что можно, даже создать представление только для запроса с Activity, а потом уже в коде использовать его.

Если требование именно через ESQ нужно ради учёта прав доступа, то view как раз их все обойдёт.

Зверев Александр,

Ну, можно специальную view тогда написать)))

Алла Савельева,

Представление не подойдет.

1.Мне нужны агрегированные данные за определенный период, т.е. мне во вьюшку надо было бы передать диапазон дат и чтобы она вернула агрегированные данные за этот диапазон. Я не знаю как это сделать. 

2. Мне нужно встроиться в существующий механизм, который как раз использует ESQ.

3. Ну и права не помешают.

Зверев Александр,

Хорошо, я подумаю как вывернуть запрос. Может что то получится. Спасибо за совет.

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