/ / LINQ select (utilisant un cadre d'entité) - linq, entity-framework, linq-to-entity

LINQ select (utilisant l'entité framework) - linq, entity-framework, linq-to-Entités

Avoir les tables suivantes:

  • messages

entrer la description de l'image ici


  • MessageThread

entrer la description de l'image ici


  • MessageThreadParticipant

entrer la description de l'image ici


  • MessageReadState

entrer la description de l'image ici

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) entrer la description de l'image ici

Merci

Réponses:

4 pour la réponse № 1

Une 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'utilisateur givenLoginId participe à
  • NewestMessage.Message : le nouveau message dans ce fil
  • NewestMessage.HasBeenRead : un drapeau booléen si le dernier message a été lu