2016-04-19 25 views
0

私は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間の外部キーのリンクを使用していませんよユーザーのオブジェクトは他のオブジェクトに依存しないため、ナビゲーションプロパティを使用するのではなく、ユーザー名だけでクエリを実行します。

答えて

3

Any拡張子を使用して、ユーザーが受信者の1人であり、メッセージが未読であることを確認できます。私は予想していたよりも簡単だった

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

、ありがとうございました! –

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

あなたの答えがどのように問題を解決するかを説明してください。 – Raghuveer