Добрый день, Коллеги !!!
У меня возник вопрос, как добавить фильтр с подзапросом в DataSource или как загрузить в DataSource EntitySchemaQuery или отобразить вместимое EntitySchemaQuery на гриде. Так как метод CreateFilter() в DataSource отсуствует.
Пример запроса
SELECT ID FROM TABLE WHERE ID IN (SELECT ID FROM TABLE2 WHER FIELD=1);
Нравится
Здравствуйте, Сергей!
Пример создания подобного фильтра для Datasource ниже:
var dataSource = Page.DataSource; var structure = dataSource.CurrentStructure; var filtersName = "SubselectFilters"; var filters = dataSource.FindFiltersGroupByName(filtersName); if (filters != null) { structure.Filters.Remove(filters); } filters.Add(structure.CreateIsNotNullFilter(dataSource.Schema, "[Activity:Id:Id].Id")); structure.Filters.Add(filters);
при необходимости можете использовать механизм вложенных фильтров.
Здраствуйте, Анна.
А подскажите как реализовать примерно такой запрос?
SELECT [Account].[Id] FROM [dbo].[Account] INNER JOIN [dbo].[AccountAddressCLADR] ON ([Account].[Id] = [AccountAddressCLADR].[AccountId]) --INNER JOIN [dbo].[Address] ON ([Address].[Id] = [AccountAddressCLADR].[AddressId]) WHERE [AccountAddressCLADR].[AddressString] LIKE N'%' + N'Кобрин' + N'%' UNION SELECT [Account].[Id], Account.Name FROM [dbo].[Account] INNER JOIN [dbo].[Contact] ON ([Account].[Id] = [Contact].[AccountId]) INNER JOIN [dbo].[ContactAddressCLADR] ON ([Contact].[Id] = [ContactAddressCLADR].[ContactId]) INNER JOIN [dbo].[Address] ON ([Address].[Id] = [ContactAddressCLADR].[AddressId]) WHERE [Address].[AddressString] LIKE N'%' + N'Кобрин' + N'%'
Здравствуйте, Илья!
В данном случае я рекомендую использовать запросы в БД при помощи DBExecutor, для того, чтобы выбрать необходимые идентификаторы, а затем передавать их в фильтр. Пример:
var sel = new Select(Page.UserConnection) .Column("Account", "Id") .Column("Account", "Name") .Column("AccountCommunication", "Number") .Column("CommunicationType", "Name").As("CommunicationTypeName") .From("Account") .Join(JoinType.Inner, "AccountCommunication").As("AccountCommunicationSearch") .On("Account", "Id").IsEqual("AccountCommunicationSearch", "AccountId") .Join(JoinType.Inner, "CommunicationType") .On("CommunicationType", "Id").IsEqual("AccountCommunicationSearch", "CommunicationTypeId") .Join(JoinType.Inner, "AccountCommunication").As("AccountCommunication") .On("Account", "Id").IsEqual("AccountCommunication", "AccountId") .Where("CommunicationType", "Id").In(_communicationTypeUidQP) .And("CommunicationType", "Id").IsEqual("AccountCommunication", "CommunicationTypeId") .And("AccountCommunicationSearch", "SearchNumber").IsLike(Column.Parameter(_searchNumber)) .OrderByAsc("Account", "Name").OrderByAsc("CommunicationType", "Name") as Select; using (DBExecutor dbExecutor = _userConnection.EnsureDBConnection()) { using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)) { while (dataReader.Read()) { var id = new Guid(dataReader["Id"].ToString()); var number = dataReader["Number"].ToString(); if (!_accountDictionary.ContainsKey(id)) { _accountDictionary.Add(id, dataReader["Name"].ToString()); _communicationInfo.Add(id, new Dictionary<string, string>()); } if (!_communicationInfo[id].ContainsKey(number)) { _communicationInfo[id].Add(number, dataReader["CommunicationTypeName"].ToString()); } } } }