如何在LINQ中选择嵌套在另一个集合中的集合

时间:2011-05-13 11:21:40

标签: linq ef-code-first

说我有以下内容:

( - > = 1到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; }        
    }

我希望 res 变量可以保存所有附件,但即使有行也是空的。我错过了什么?

2 个答案:

答案 0 :(得分:1)

你的情况没有意义,我甚至认为它没有编译 你说,你希望res能够拥有所有附件。为什么要这样?您甚至不在查询中的任何位置使用附件 没有你的实际课程,建议正确的方法有点难,但我认为它会是这样的:

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

现在,res包含标识为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;}
}

答案 1 :(得分:0)

在上下文中,需要告知它使用诸如

之类的包含来获取导航属性
_ctx.UserMessage.Include("Attachments")
                .SelectMany( ... )

HTH