Я пытаюсь добиться именно того, что объясняется здесь: Создание потоковой частной системы обмена сообщениями, такой как facebook и gmail, однако я не полностью понимаю ответ Джоэла Брауна. может кто-нибудь объяснить.
Это то, что мои таблицы db выглядят как с образцовыми данными (я предполагаю, что я правильно заполнил его для демонстрационных целей):
-
Мне нужно отобразить список потоков на основе LoginId (самый новый сверху), как бы выглядел запрос в LINQ? (то, что я спрашиваю, входит в группу потоков сообщений, дайте мне 1 новое сообщение в каждом потоке) - так же, как это делается на facebook.
-
Мне нужно отображать ВСЕ сообщения в потоке сообщений (LINQ) → точно так же, как это делается на facebook, где вы нажимаете сообщение, и вы увидите весь "разговор" в протекте.
Пожалуйста, помогите! спасибо
EDIT → продолжение Джоэл, это правильно?
Джоэл, я немного смущен, не могли бы вы объяснить (комментарии/вопросы выделены жирным шрифтом):
Идея здесь в том, что каждый раз, когда пользователь начинает новый поток/сообщение, он начинается с новой записи в таблице THREAD. Затем пользователь добавляется как THREAD_PARTICIPANT, а содержимое сообщения добавляется к MESSAGE, которое указывает на содержащую THREAD. FK от MESSAGE к USER указывает автора сообщения.
LoginId 1 отправляет сообщение LoginId2 = > новая запись вставляется в таблицу MessageThread. Также запись записывается в запись MessageThreadParticipant с MessageThreadId = 1, LoginId = 1 (отправитель). И новая запись вставляется в таблицу сообщений с MessageId = 1, MessageThreadid = 1, SenderLoginId = 1 (правильно?)
это то, что я получил после этой итерации:
Я думаю, что я запутался, потому что нет пути для Loginid 2, чтобы знать, что для него есть сообщение.?? Или, может быть, мне нужно вставить 2 записи в MessageThreadParticipant?? (отправитель и получатель) → таким образом оба могут видеть весь "разговор"
EDIT2: Джо, я думаю, я мог бы это сделать:
SELECT
Message.MessageId, Message.CreateDate, Message.Body, Login.Username, Message.SenderLoginId
, (SELECT MessageReadState.ReadDate
FROM MessageReadState
WHERE MessageReadState.MessageId = Message.MessageId
) as ReadDate
FROM Message
INNER JOIN Login ON Message.SenderLoginId = Login.LoginId
INNER JOIN MessageThreadParticipant mtp on mtp.MessageThreadId = Message.MessageThreadId
AND ( Message.MessageId in
( SELECT Max(Message.MessageId)
FROM MessageThreadParticipant INNER JOIN Message
ON MessageThreadParticipant.MessageThreadId = Message.MessageThreadId
GROUP BY MessageThreadParticipant.MessageThreadId
)
)
Where mtp.LoginId = 2
ORDER BY Message.CreateDate DESC;
Пожалуйста, поправьте меня, если я ошибаюсь:)