多对多Linq查询

时间:2016-04-19 12:04:18

标签: c# entity-framework linq

我正在努力解决linq问题。

我有以下型号:

public class Message
{
    public Message()
    {
        Date = DateTime.Now;
        MessageRecipients = new List<MessageRecipient>();
    }
    [Key]
    public int MessageID { get; set; }

    public string Body { get; set; }

    public DateTime Date { get; set; }

    public List<MessageRecipient> MessageRecipients { get; set; }

}

public class MessageRecipient
{
    public MessageRecipient()
    {
        HasBeenRead = false;
    }
    [Key]
    public int MessageRecipientID { get; set; }

    public Message Message { get; set; }
    public string User { get; set; }
    public bool HasBeenRead { get; set; }

}

向多个邮件收件人发送邮件。我正在尝试编写一个查询,以获取特定用户的未读消息。

我可以为用户收到消息,但我似乎无法扩展查询以获取未读的消息:

public List<Message> GetMessageForUser(ApplicationUser user)
{
var messages = dbContext.Messages
    .Where(x => x.MessageRecipients.Select(y => y.User).Contains(user.UserName))                    
    .OrderByDescending(p => p.Date);
}

由于公司的决定,我没有在ApplicationUser和MessageRecipients之间使用外键链接 - 用户对象不依赖于其他对象,所以我们只通过用户名查询,而不是使用导航属性。 / p>

2 个答案:

答案 0 :(得分:3)

您可以使用Any扩展名并验证用户是收件人之一且邮件未读。

var messages = dbContext.Messages
    .Where(x => x.MessageRecipients.Any(y => y.User ==.user.UserName && !y.HasBeenRead ))                    
    .OrderByDescending(p => p.Date);

答案 1 :(得分:0)

var messages = dbContext.MessageRecipients
                        .Where(y => y.User ==.user.UserName && !y.HasBeenRead)
                        .Select(g=>g.Message)
                        .ToList()