LINQ select (с использованием структуры объекта) - PullRequest
0 голосов
/ 21 сентября 2011

Имеются следующие таблицы:

  • Сообщения

enter image description here


  • MessageThread

enter image description here


  • MessageThreadParticipant

enter image description here


  • MessageReadState

enter image description here

Мне нужно получить следующее с помощью LINQ (я использую EF4, поэтому они знают друг друга).

1) Получить список сообщений TOP 1 (из ветки), также помечая, если это новое сообщение для данного LoginId

так например (loginId 118)

Должен отображаться список только из 1 элемента с идентификатором сообщения: 368 (потому что я участвую в этом разговоре). Кроме того, мне нужно знать, что это НОВОЕ сообщение для LoginId 118, потому что MessageReadState не имеет записи для меня.

example2: (логин 116) должен перечислить 4 темы, потому что я участвую в ThreadId (24, 25, 26,27). С последним сообщением из каждой темы.

EDIT: EF (если кто-то использует ту же структуру) enter image description here

спасибо

1 Ответ

4 голосов
/ 21 сентября 2011

На вопрос о LINQ (для сущностей) трудно ответить, если вы не показываете свои сущности с их навигационными свойствами. Но предполагая, что у классов и свойств навигации есть все, что вам нужно для выполнения такого запроса, я бы попробовал это:

var result = context.MessageThreadParticipants
    .Where(mtp => mtp.LoginId == givenLoginId)
    .Select(mtp => new
    {
        MessageThread = mtp.MessageThread,
        NewestMessage = mtp.MessageThread.Messages
           .OrderByDescending(m => m.CreateDate)
           .Select(m => new
           {
               Message = m,
               HasBeenRead = m.MessageReadStates
                   .Any(mrs => mrs.LoginId == givenLoginId)
           })
           .FirstOrDefault(),
    })
    .ToList();

Итак, сущность MessageThreadParticipant должна иметь свойство MessageThread. У объекта MessageThread должна быть коллекция Messages, а у объекта Message должна быть коллекция MessageReadStates.

result - это коллекция анонимных объектов. Каждый объект содержит:

  • MessageThread: поток, в котором участвует пользователь с givenLoginId
  • NewestMessage.Message: самое новое сообщение в этой теме
  • NewestMessage.HasBeenRead: логический флаг, если последнее сообщение было прочитано
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...