2011-05-13 4 views
0

Dire que je donne les résultats suivants:Comment sélectionner une collection imbriquée dans une autre collection LINQ

(-> = 1 à plusieurs mises en œuvre comme une collection dans le code premier EF)

message -> UserMessage

message -> Accessoires

Quand j'appelle les éléments suivants:

var res = _ctx.DataContext.UserMessage.Where(x => x.UserId) 
             .Select(m => m.Message).ToList(); 

EDIT: Ajout de catégories:

public class Message 
{ 
    public int MessageId { get; set; } 

    public ICollection<Attachment> Attachments { get; set; } 

    [Required] 
    public string Text { get; set; }  
} 



    public class Attachment 
    { 
     public int AttachmentId { get; set; } 

     public int MessageId { get; set; } 
     public virtual Message Message { get; set; } 

     public string FileServerPath { get; set; } 
    } 



    public class UserMessage 
    { 
     public int UserMessageId { get; set; } 

     [Required] 
     public int MessageId { get; set; } 
     public Message Message { get; set; } 

     [Required] 
     public int UserId { get; set; } 
     public User User { get; set; }   
    } 

je me attends les res variable pour contenir toutes les pièces jointes, mais il est vide, même s'il y a des lignes. Qu'est-ce que je rate?

Répondre

1

Votre condition où n'a pas de sens, je ne pense même pas qu'il compile.
Vous dites, vous attendez res pour contenir toutes les pièces jointes. Pourquoi devrait-il? Vous n'utilisez même pas la pièce jointe n'importe où dans votre requête.
Sans vos classes réelles, il est un peu difficile de suggérer la bonne façon, mais je pense que ce serait quelque chose comme ceci:

var res = _ctx.DataContext.UserMessage.Where(x => x.UserId == currentUserId) 
             .SelectMany(m => m.Message.Attachments) 
             .ToList(); 

Maintenant, res contient toutes les pièces jointes de tous les messages de l'utilisateur avec l'ID currentUserId.

Je suppose une mise en page de classe comme ceci:

class UserMessage 
{ 
    public int UserId {get;set;} 
    public Message Message {get;set;} 
} 

class Message 
{ 
    public IEnumerable<Attachment> Attachments {get;set;} 

    // Irrelevant for the query in its current form: 
    public IEnumerable<UserMessage> UserMessages {get;set;} 
} 
+0

Je J'ai ajouté plus de classes pour que vous puissiez voir que ma structure est différente de la vôtre. C'est dans le contexte de code-first & EF d'où la duplication des Ids et des tables dans les classes pour représenter les relations et spécifier les FK. – jaffa

+0

@jaffa: S'il vous plaît essayer mon code. Vos cours sont les mêmes que les miens en ce qui concerne les parties pertinentes. –

+0

Je l'ai mis comme réponse mais j'ai fini par l'implanter légèrement différente. Mon 'aggregate aggregate' est maintenant la classe Parent, avec la méthode Include() utilisée sur la classe imbriquée qui à son tour contient la collection. – jaffa

0

Sur le contexte, il doit être dit d'acquérir les propriétés de navigation avec un include tels que

_ctx.UserMessage.Include("Attachments") 
       .SelectMany(...) 

HTH

+0

qui ne semble pas correct, pourquoi incluez-vous "UserMessage" si vous interrogez déjà cela hors contexte? – jaffa

+0

@Jaffa Oui, vous avez raison de ne pas obtenir l'élément de niveau supérieur dans un include. ONe ne fait que les sous-items, j'ai donc édité le post. THX – OmegaMan

Questions connexes