Обычно если мы в ESQ используем произвольные или обратные связи то обычно строиться LEFT OUTER JOIN с наименованием колонки по которой присоединил.
Например:
FROM TsMarketingApplication tsma
LEFT OUTER JOIN Activity a ON a.Id=tsma.TsActivityId
Если корневая схема TsMarketingApplication то будет
Но если мне нужен JOIN по двух колонках сразу, как быть?
например:
FROM TsMarketingApplication tsma
LEFT OUTER JOIN Activity a ON a.Id=tsma.TsActivityId
LEFT OUTER JOIN ContactCareer CC ON CC.ContactId = A.OwnerId AND CC.AccountId=A.AccountId
Заранее признателен
Нравится
Виталий, здравствуйте,
Ознакомтесь, пожалуйста, со статьей на академии по данному вопросу:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/ispolzovanie-ent…
Хорошего вечера!
С уважением,
Валерия
Но там как раз описывается пример с JOIN по одной колонке. Я правильно понимаю что ESQ такого не умеет?
Здравствуйте, Виталий.
Подробную информацию о возможностях ESQ, Вы можете найти в SDK.
Так же, для построение более сложных запросов, рекомендую Вам смотреть на более низкоуровневый класс Select. Данный класс используется внутри ESQ и позволяет построить более сложные запросы к базе данных.
Я бы через Select брал.
Select select = new Select(userConnection) .Column(@"ContactCareer", @"SpecializationId").As("SpecId") .From(@"TsMarketingApplication") .LeftOuterJoin("Activity").On("Activity", "Id").IsEqual("TsMarketingApplication", "TsActivityId") .LeftOuterJoin("ContactCareer").On("ContactCareer", "ContactId").IsEqual("Activity", "OwnerId") .And("ContactCareer", "AccountId").IsEqual("Activity", "AccountId") as Select; using (DBExecutor executor = userConnection.EnsureDBConnection()) { using (IDataReader reader = executor.ExecuteReader(select.GetSqlText(), select.Parameters)) { while (reader.Read()) { string result = reader.GetColumnValue<Guid>(@"SpecId").ToString(); //Обработка результатов } reader.Close(); } }