Добрый день, Коллеги !!! У меня возник вопрос, как добавить фильтр с подзапросом в DataSource или как загрузить в DataSource EntitySchemaQuery или отобразить вместимое EntitySchemaQuery на гриде. Так как метод CreateFilter() в DataSource отсуствует.
Пример запроса
SELECT ID FROM TABLE WHERE ID IN (SELECT ID FROM TABLE2 WHER FIELD=1);
А подскажите как реализовать примерно такой запрос?
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());}}}}