С помощью какого метода построить Not Exists-фильтр C#
Есть 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.
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии
- Цитировать