2011-05-13 116 views
0
集合

說我有以下內容:如何選擇嵌套在另一個集合中的在LINQ

( - > = 1到多達在EF代碼優先的集合實現)

消息 - > UserMessage

信息 - >附件

當我撥打以下:

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

編輯:補充類:

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; }   
    } 

我期望資源變量來容納所有的附件,但即使有排它是空的。我錯過了什麼?

回答

1

你的條件沒有意義,我甚至不認爲它編譯。
你說,你期望res持有所有附件。爲什麼要這樣?您甚至不會在查詢中的任何位置使用附件。
沒有實際的類,它是一個有點難以識別正確的方式,但我認爲這將是這樣的:

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

現在,res包含的ID的用戶的所有郵件的所有附件currentUserId

我假定一類佈局是這樣的:

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

I」的上下文我添加了更多的類,所以你可以看到我的結構與你的結構不同。這是在代碼優先和EF的背景下進行的,因此在類中重複使用ID和表來表示關係並指定FK。 – jaffa 2011-05-13 12:33:14

+0

@jaffa:請嘗試我的代碼。關於相關部分,您的課程與我的課程相同。 – 2011-05-13 13:02:50

+0

我已將它設置爲已回答,但我最終實現了稍有不同。我的'聚合根'現在是父類,在嵌套類上使用了Include()方法,該方法又保存了集合。 – jaffa 2011-05-17 12:28:46

0

在它需要被告知以獲取與一個導航屬性包括諸如

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

HTH

+0

這看起來不正確,如果你已經查詢了上下文,爲什麼要包含「UserMessage」? – jaffa 2011-05-13 12:59:10

+0

@Jaffa是的,你是對的,不會得到包含的頂級項目。 ONe只做子項目,所以我編輯了這篇文章。謝謝 – OmegaMan 2011-05-13 15:30:21