Учитывая следующее:

Мне нужно иметь возможность получить список всех потоков, в которых принимал участие данный пользователь, отсортированных сначала по самому последнему сообщению, сотображается только самое последнее сообщение (1 сообщение в цепочке)
Это SQL-запрос для вышеупомянутого:
SELECT
Message.MessageId,
Message.CreateDate,
Message.Body,
Login.Username,
(SELECT MessageReadState.ReadDate
FROM MessageReadState
WHERE MessageReadState.MessageId = Message.MessageId
AND MessageReadState.LoginId = 2) AS ReadState
FROM Message INNER JOIN Login ON Message.SenderLoginId = Login.LoginId
WHERE Message.MessageId IN (
SELECT Max(Message.MessageId)
FROM MessageThreadParticipant
INNER JOIN Message
ON MessageThreadParticipant.MessageThreadId = Message.MessageThreadId
WHERE MessageThreadParticipant.LoginId=2
GROUP BY MessageThreadParticipant.MessageThreadId
)
ORDER BY Message.CreateDate DESC;
Вот как это работает.a Loginid 1 отправляет LoginId 2 сообщение:
- , создается новая тема и запись вставляется в MessageThread
- , новая запись добавляется в таблицу сообщений с указанным treadId сверху.
ДВА записи вставляются в MessageThreadParticipant (LoginId отправителя и LogiId получателя)
Когда пользователь открывает свой список сообщений, MessageReadState обновляет ReadDate сообщения.
ВОПРОС: Я хотел бы создать представление, где я мог бы просто фильтровать по LoginId (я бы использовал LINQ).Однако я не могу сделать это с помощью запроса выше (так как мне нужно было бы передать loginId где-то в инструкции SQL).Есть ли способ изменить вышеуказанный SQL-запрос таким образом, чтобы я мог иметь представление?что это такое?
РЕДАКТИРОВАТЬ: я думаю, что у меня есть, но я не уверен, что это лучшее / наиболее эффективное решение:
SELECT
Message.MessageId,
Message.MessageThreadId,
Message.SenderLoginId,
Mtp.LoginId,
Login.Username,
Message.CreateDate,
Message.Body,
(SELECT MessageReadState.ReadDate
FROM MessageReadState
WHERE MessageReadState.MessageId = Message.MessageId
AND MessageReadState.LoginId = Mtp.LoginID) AS ReadState
FROM Message
INNER JOIN Login ON Message.SenderLoginId = Login.LoginId
INNER JOIN MessageThreadParticipant Mtp ON Mtp.MessageThreadId = Message.MessageThreadId
WHERE Message.MessageId IN (
SELECT Max(Message.MessageId)
FROM MessageThreadParticipant
INNER JOIN Message
ON MessageThreadParticipant.MessageThreadId = Message.MessageThreadId
WHERE MessageThreadParticipant.LoginId=Login.LoginID
GROUP BY MessageThreadParticipant.MessageThreadId
)
ORDER BY Message.CreateDate DESC;