2016-07-13 116 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? - 希望你明白我的意思 –