Avoir les tables suivantes:
- messages
- MessageThread
- MessageThreadParticipant
- MessageReadState
Je dois obtenir ce qui suit avec LINQ (je m’utilise avec EF4 pour que ceux-ci se connaissent bien).
1) Obtenir une liste du message TOP 1 (d'un fil), en indiquant également s'il s'agit d'un nouveau message pour un identifiant de connexion donné
donc par exemple (loginId 118)
Devrait afficher une liste de seulement 1 élément avec unmessageID: 368 (parce que je participe à cette conversation). De plus, j’ai besoin de savoir qu’il s’agit d’un NOUVEAU message pour LoginId 118 car MessageReadState n’a pas d’entrée pour moi.
example2: (Identifiant 116) devrait énumérer 4 discussions parce que je participe à threadId "s (24, 25, 26, 27). Avec un nouveau message de chaque discussion.
MODIFIER: EF (si quelqu'un utilise la même structure)
Merci
Réponses:
4 pour la réponse № 1Une question sur LINQ (aux entités) est difficilepour répondre si vous n’indiquez pas à vos entités leurs propriétés de navigation. Mais en supposant que les classes et les propriétés de navigation disposent de tout ce dont vous avez besoin pour effectuer une telle requête, je voudrais essayer ceci:
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();
Donc, entité MessageThreadParticipant
doit avoir un MessageThread
propriété. Entité MessageThread
doit avoir un Messages
collection et entité Message
doit avoir un MessageReadStates
collection.
result
est alors une collection d'objets anonymes. Chaque objet contient:
MessageThread
: le fil avec l'utilisateurgivenLoginId
participe àNewestMessage.Message
: le nouveau message dans ce filNewestMessage.HasBeenRead
: un drapeau booléen si le dernier message a été lu