2016-07-13 154 views
0

對話列表我正在尋找獲取最近的對話列表的好方法。獲取與實體框架和linq

我做了一個收件箱的用戶界面,我正在尋找實施獲取對話列表的正確方法。

我已成立,具有相對於Message

public class Message 
    { 
     public int Id { get; set; } 
     public string Content { get; set; } 
     public string UserId { get; set; } 
     public ApplicationUser User { get; set; } 

     public DateTime CreateDate { get; set; } 
     public List<MessageReceived> MessagesReceived { get; set; } 
     public List<MessageSent> MessagesSent { get; set; } 
    } 

    public class MessageReceived 
    { 
     public int Id { get; set; } 
     public int MessageId { get; set; } 
     public virtual Message Message { get; set; } 

     public string FromUserId { get; set; } 
     public ApplicationUser FromUser { get; set; } 

     public string ToUserId { get; set; } 
     public ApplicationUser ToUser { get; set; } 

     public DateTime DateRecieved { get; set; } 
     public DateTime DateRead { get; set; } 
     public bool Deleted { get; set; } 
    } 

而對於下表,現在我有這個在我的控制器

public ActionResult Index() 
    { 
     var userId = User.Identity.GetUserId(); 
     var messages = db.MessageReceived.Where(p => p.ToUserId == userId).GroupBy(p => p.FromUser.UserName); 
     return View(messages); 
    } 

這將返回用戶名的列表用戶已收到消息,包括接收消息時創建的所有行。這不是我的目標。當查詢多個長對話時,它可能會很糟糕

是否有更有效的方式來查詢對話列表,比使用group by?

+0

所以我只想澄清:您是否在尋找一個用戶名列表或消息列表?如果您發佈視圖,它也可能有所幫助。 –

+0

對不起,它的用戶名突出顯示的對話列表:) –

+0

「對話列表」是否指「某些用戶發送和接收的所有相關消息的列表」?您是否嘗試使用提供的用戶ID對(例如,A和B互相通話)將收到的消息列表與發送的消息列表進行連接? –

回答

0

如果你需要的是一個用戶收到的郵件名稱列表,查詢這個更有效的方式是:

var names = db.MessageRecieved.Where(p => p.ToUserId == userId).Select(p => p.FromUser.UserName).Distinct().ToList(); 
+0

因此,這將跳過數據庫級​​的所有複製的項目嗎?它不會讀取10 *用戶名,然後跳過內存中的9? - 希望你明白我的意思 –