Есть sql-запрос вида:
select *
from Table T
where T.ProjectId = @ProjectId
and not exists (select * from Table T1
where T1.ContactId = @ContactId
and T1.ParameterId = T.ParameterId)
Использование метода CreateFilterWithParameters() позволяет построить параметризированный запрос, но только exists:
var esqCardBlock = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Table");
esqCardBlock.AddAllSchemaColumns();
var CardBlockFilters = esqCardBlock.Filters; CardBlockFilters.Add(esqCardBlock.CreateFilterWithParameters(FilterComparisonType.Equal,
"Project", projectId)); CardBlockFilters.Add(esqCardBlock.CreateFilterWithParameters(FilterComparisonType.Equal,
"[Table:Parameter:Parameter].Contact", contact));
Если же использовать CreateNotExistsFilter(), то не понятно, куда добавлять значение параметра @ContactId.
Какой всё-таки метод использовать для построения параметризированного запроса Not Exists?
Нравится
Алла, возможно, такое получится при помощи выставления группе фильтров свойства .IsNot = true;
Как тут:
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity");
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Owner", currentUserId));
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Greater, "ModifiedOn", LastSyncDate));
if (IsFirstSync) {
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Greater, "DueDate", Today));
}
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "ShowInScheduler", true));
var filtersByExisting = new EntitySchemaQueryFilterCollection(esq);
filtersByExisting.IsNot = true;
var notExFilter = esq.CreateFilterWithParameters(
FilterComparisonType.IsNotNull,
"[ActivityCorrespondence:Activity].SourceActivityId");
filtersByExisting.Add(notExFilter);
filtersByExisting.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"[ActivityCorrespondence:Activity].SourceAccount.Id", SourceAccountId));
esq.Filters.Add(filtersByExisting);
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.LessOrEqual, "CreatedOn", CurrentSyncDateTime));
var entityCollection = esq.GetEntityCollection(UserConnection);
Саша,
спасибо за ответ. Я тоже уже думала так сделать, попробую и напишу о результате ![]()
Саша,
таким способом, как ты предложил, получилось построить нужный фильтр.
Ещё вопрос: почему в документации на академии написано, что метод CreateFilterWithParameters перегруженный https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-vych…;Что имеется ввиду?
Алла, у меня по этой ссылке нет слов «перегруженный» и «CreateFilterWithParameters».
Ошибка, речь идет об этой ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-11/ispolzovanie-en…
Речь о том, что есть несколько реализаций метода с разными наборами его агрументов. См. их все тут для CreateFilterWithParameters.
Зверев Александр,
А подскажите, пожалуйста, есть ли аналог ".IsNot = true" в entitySchemaQuery на стороне клиента?
И если нет, то как по другому в js можно построить подобный фильтр?