Добрый день, Коллеги !!!
У меня возник вопрос, как добавить фильтр с подзапросом в DataSource или как загрузить в DataSource EntitySchemaQuery или отобразить вместимое EntitySchemaQuery на гриде. Так как метод CreateFilter() в DataSource отсуствует.
Пример запроса
SELECT ID FROM TABLE WHERE ID IN (SELECT ID FROM TABLE2 WHER FIELD=1);
Нравится
Здравствуйте, Сергей!
Пример создания подобного фильтра для Datasource ниже:
[csharp]
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);
[/csharp]
при необходимости можете использовать механизм вложенных фильтров.
Здраствуйте, Анна.
А подскажите как реализовать примерно такой запрос?
[csharp]
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'%'
[/csharp]
Здравствуйте, Илья!
В данном случае я рекомендую использовать запросы в БД при помощи DBExecutor, для того, чтобы выбрать необходимые идентификаторы, а затем передавать их в фильтр. Пример:
[csharp]
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());
}
if (!_communicationInfo[id].ContainsKey(number)) {
_communicationInfo[id].Add(number, dataReader["CommunicationTypeName"].ToString());
}
}
}
}
[/csharp]