Как выбрать коллекцию, вложенную в другую коллекцию в LINQ - PullRequest
0 голосов
/ 13 мая 2011

Скажите, что у меня есть следующее:

(-> = 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 ]

1 голос
/ 13 мая 2011

Ваше условие «где» не имеет смысла, я даже не думаю, что оно компилируется.
Вы говорите, что ожидаете, что res будет содержать все вложения. Зачем это? Вы даже не используете Attachment нигде в своем запросе.
Без ваших реальных классов немного сложно предложить правильный путь, но я думаю, что это будет примерно так:

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;}
}
0 голосов
/ 13 мая 2011

В контексте необходимо указать свойства навигации с включением, например

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

HTH

...