Есть 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 можно построить подобный фильтр?