Подзапрос с использованием класса Select.

Коллеги, приветствую.

Есть некоторый запрос, который возвращает дату платежа и дату последней активности по платежу:

SELECT
        ContactId AS debtorId,
        t1.CreatedOn AS activityDate,
        t2.CreatedOn AS paymentDate
FROM Activity AS t1 INNER JOIN UsrPayments AS t2
        ON t1.ContactId = t2.UsrDebtorId
WHERE t1.CreatedOn = (
        SELECT max(CreatedOn) FROM Activity
        WHERE t1.ContactId = t2.UsrDebtorId
);

И есть некоторый код C#, где с помощью подзапроса я хочу определить дату последней активности по платежу, аналогично тому, как я это делаю выше на native SQL:

var selectNewPayments = (Select)new Select(userConnection)
        .Column("t1", "ContactId")
        .Column("t1", "CreatedOn")
        .Column("t2", "CreatedOn")
        .From("Activity").As("t1")
        .Join(JoinType.Inner, "UsrPayments").As("t2")
        .On("t1", "ContactId").IsEqual("t2", "UsrDebtorId")
        .Where("... здесь подзапрос и обращение к функции max() ...")
        as Select;

Как этот подзапрос написать?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

5 комментариев

Здравствуйте!
Все функции описаны по ссылке.

Пример:

SELECT 
C.Name,
(SELECT COUNT(*) FROM Activity A WHERE A.ContactId = C.Id) As ActivityCount
FROM Contact C

Перевод в С#:

var subSelect = new Select(userConnection)
                .Column(Func.Count(Column.Asterisk()))
.From("Activity").As("A")
.Where("C", "Id").IsEqual("A", "ContactId").As("ActivityCount")
var select = new Select(userConnection)
                .Column("C", "Name")
                .Column(subSelect)
.From("Contact").As("C")

Супер! Алексей, спасибо большое.

А можно то же самое, только не Select'ом а с помощью ESQ?

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

Примеры доступны по ссылке:
https://www.terrasoft.ru/bpmonlinesdk/UsingEntitySchemaQuery.html

"Шамшин_Олег" написал:А можно то же самое, только не Select'ом а с помощью ESQ?

1. Делаете один esq запрос на содержимое подзапроса, выбираете из него, список Id, или чего вам нужно, в оригинальном посте подзапрос выбирал CreatedOn. Формируете массив этих CreatedOn.

2. В колбеке после возврата результата подзапроса, формируете новый esq запрос, с фильтрацией нужной колонки, в оригинальном посте CreatedOn на вхождение в массив ранее выбранных CreatedOn.

Т.к. фильтрация createColumnInFilterWithParameters спокойно проверит вхождение колонки и в массив.
Пример оторванный от контекста esq, рассматривает только создания фильтра, но такой фильтр подставленный в esq будет работать и в esq:
http://www.community.terrasoft.ru/forum/topic/11497#comment-50859

Показать все комментарии