【问题标题】:How to query conversation summary with Users and Show Latest Message如何查询与用户的对话摘要并显示最新消息
【发布时间】:2017-04-03 13:32:09
【问题描述】:

我有一个聊天应用程序并在边栏中。我需要使用 Entity Framework 显示所有用户名和我与他们对话的最后一条消息。以下是实体对象

public partial class ObjectMessage
{
    public int Id { get; set; }
    public int FromUserId { get; set; }
    public int ToUserId { get; set; }
    public string Body { get; set; }
    public System.DateTime DateSent { get; set; }
    public bool Unread { get; set; }

}

我尝试了以下查询,但没有产生预期的结果。

            var messages = db.ObjectMessages.Where(x => x.ToUserId == userId || x.FromUserId == userId)
            .OrderByDescending(x => x.DateSent)
            .GroupBy(x => new { x.ToUserId, x.FromUserId })
            .Select(x => new LastMessage
            {
                FromUserId = x.FirstOrDefault().FromUserId,
                ToUserId = x.FirstOrDefault().ToUserId,
                Body  = x.FirstOrDefault().Body,
                DateSent = x.FirstOrDefault().DateSent,
                Me = x.FirstOrDefault().FromUserId == userId,
                Unread = x.Count(i=> i.Unread)
            }).OrderBy(x=> x.DateSent).ToList();

我的用户 ID 在两个属性中(从/到)。可能是表结构不是最好的方法,或者必须有一个好的方法来实现结果。请指教。

【问题讨论】:

  • 顺便说一下,我有一个单独的用户列表,我会将最后一条消息附加到其相关用户。
  • 当你是FromUserId 时,你需要最后一条消息,然后是ToUserId 并将它们组合成Dictionary<UserId, message> 之类的东西?
  • 无论我是 FromUserId 还是 ToUserId,我都需要最新消息。这样做的目的是我列出所有朋友列表名称,并在每个名称下显示对话的最后一条消息,无论是来自我还是他。
  • 你只需要看看你发了最后一条消息还是没关系?

标签: c# asp.net entity-framework chat


【解决方案1】:

假设你有以下测试数据:

var messages = new List<ObjectMessage>();
messages.Add(new ObjectMessage { Id = 1000, Body = "AAA", DateSent = new DateTime(2017, 01, 14, 0, 0, 0), Unread = false, FromUserId = 1, ToUserId = 6 });
messages.Add(new ObjectMessage { Id = 1001, Body = "BBB", DateSent = new DateTime(2017, 01, 14, 0, 0, 0), Unread = false, FromUserId = 3, ToUserId = 2 });
messages.Add(new ObjectMessage { Id = 1002, Body = "CCC", DateSent = new DateTime(2017, 01, 14, 0, 0, 0), Unread = false, FromUserId = 7, ToUserId = 6 });
messages.Add(new ObjectMessage { Id = 1003, Body = "DDD", DateSent = new DateTime(2017, 01, 15, 0, 0, 0), Unread = false, FromUserId = 1, ToUserId = 6 });
messages.Add(new ObjectMessage { Id = 1004, Body = "EEE", DateSent = new DateTime(2017, 02, 18, 0, 0, 0), Unread = false, FromUserId = 2, ToUserId = 3 });
messages.Add(new ObjectMessage { Id = 1005, Body = "FFF", DateSent = new DateTime(2017, 01, 14, 0, 0, 0), Unread = false, FromUserId = 1, ToUserId = 7 });
messages.Add(new ObjectMessage { Id = 1006, Body = "GGG", DateSent = new DateTime(2017, 02, 20, 0, 0, 0), Unread = false, FromUserId = 8, ToUserId = 9 });
messages.Add(new ObjectMessage { Id = 1007, Body = "HHH", DateSent = new DateTime(2017, 03, 11, 0, 0, 0), Unread = false, FromUserId = 9, ToUserId = 8 });
messages.Add(new ObjectMessage { Id = 1008, Body = "III", DateSent = new DateTime(2017, 03, 12, 0, 0, 0), Unread = false, FromUserId = 8, ToUserId = 1 });
messages.Add(new ObjectMessage { Id = 1009, Body = "JJJ", DateSent = new DateTime(2017, 03, 13, 0, 0, 0), Unread = false, FromUserId = 7, ToUserId = 8 });

首先将数据与您作为发件人进行分组:

 var messagesAsSender = messages
     .Where(p => p.FromUserId == 8)
     .GroupBy(p => new { Me = p.FromUserId, Him = p.ToUserId })
     .ToDictionary(
         p => p.Key,
         p => p.OrderByDescending(t => t.DateSent)
               .FirstOrDefault());

第二次以你为接收者将数据分组:

var messagesAsReceiver = messages
    .Where(p => p.ToUserId == 8)
    .GroupBy(p => new { Me = p.ToUserId, Him = p.FromUserId })
    .ToDictionary(
        p => p.Key,
        p => p.OrderByDescending(t => t.DateSent)
              .FirstOrDefault());

最后比较一下,得到最后一条消息:

var messagesLast = messagesAsSender
    .Concat(messagesAsReceiver)
    .GroupBy(p => p.Key)
    .ToDictionary(
        p => p.Key,
        p => p.OrderByDescending(date => date.Value.DateSent)
              .FirstOrDefault()
              .Value
              .Body);

【讨论】:

  • 感谢 Cristian Szpisjak。它看起来很酷。我将对其进行测试并将此问题标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2015-05-12
  • 1970-01-01
  • 2012-10-24
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多