Добрый день, Коллеги !!!
У меня возник вопрос, как добавить фильтр с подзапросом в DataSource или как загрузить в DataSource EntitySchemaQuery или отобразить вместимое EntitySchemaQuery на гриде. Так как метод CreateFilter() в DataSource отсуствует.
Пример запроса

SELECT ID FROM TABLE WHERE ID IN (SELECT ID FROM TABLE2 WHER FIELD=1);

Нравится

3 комментария

Здравствуйте, Сергей!

Пример создания подобного фильтра для 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());
			}
		}
	}
}
Показать все комментарии