Обычно если мы в 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 брал.
[csharp]
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(@"SpecId").ToString();
//Обработка результатов
}
reader.Close();
}
}
[/csharp]