【问题标题】:linq group messages show only last ones as whats app dolinq 组消息仅显示最后的消息,就像应用程序所做的那样
【发布时间】:2020-09-03 17:09:08
【问题描述】:

我想做一个whats app风格的聊天应用。 所以,我有一个消息表作为列 发件人姓名、收件人姓名、消息、消息时间 我有用户表作为列 ID、用户名

我想显示显示最后一条消息的应用程序样式窗口和名称。 所以用户可以点击它并查看来自该用户的所有消息。

例如


约翰

嗨,我在这里。 (日期)

加布里埃尔

确实如此。 (日期)

      db.Messages
     .Where(x => x.senderName == sessionName|| x.receiverName == sessionName).OrderByDescending(x => 
      x.Id).ToList()
     .GroupBy(m => new { V = m.senderName , V1 = m.receiverName })
     .Select(x => x.First());

我已经试过了。但这有问题。

【问题讨论】:

  • 那么你的问题到底是什么?
  • 我的问题是如何为左侧的应用程序面板编写 linq 查询
  • 您需要提供比此处更多的详细信息才能获得足够的响应。请包括您的消息对象和用户的类,以便其他人可以看到数据的形状和关系。这应该有助于社区帮助你。

标签: linq chat


【解决方案1】:

以下是您正在寻找的工作示例;显示特定会话的发件人的最新消息(按最高 ID)

void Main()
{
    var messages = GetMessages();

    var latest = messages
        .GroupBy(m => m.SessionName)
        .Select(grp => grp.OrderByDescending(g => g.Id).First())
        .ToList();

    latest.ForEach(l => Console.WriteLine($"{l.SenderName}\r\n{l.MessageText} ({l.SendDate:yyyy/MM/dd HH:mm:ss})"));
}

// Define other methods and classes here
public class Message
{
    public int Id { get; set; }
    public string SessionName { get; set; }
    public string SenderName { get; set; }
    public string ReceiverName { get; set; }
    public string MessageText { get; set; } 
    public DateTime SendDate { get; set; }
}

public IEnumerable<Message> GetMessages()
{
    return new[] 
    {
        new Message
        {
            Id = 1,
            SessionName = "Savage",
            SenderName = "James T. Kirk",
            ReceiverName = "Kahn",
            MessageText = "Why would a Starfleet admiral ask a three-hundred-year-old frozen man for help?",
            SendDate = new DateTime(2320, 5, 19, 15, 0, 0)
        },
        new Message
        {
            Id = 2,
            SessionName = "Savage",
            SenderName = "Kahn",
            ReceiverName = "James T. Kirk",
            MessageText = "Because I am better.",
            SendDate = new DateTime(2320, 5, 19, 15, 0, 10)
        },
        new Message
        {
            Id = 3,
            SessionName = "Savage",
            SenderName = "James T. Kirk",
            ReceiverName = "Kahn",
            MessageText = "At what?",
            SendDate = new DateTime(2320, 5, 19, 15, 0, 20)
        },
        new Message
        {
            Id = 4,
            SessionName = "Savage",
            SenderName = "Kahn",
            ReceiverName = "James T. Kirk",
            MessageText = "Everything. Alexander Marcus needed to respond to an uncivilized threat in a civilized time, and for that, he needed a warrior's mind - my mind - to design weapons and warships.",
            SendDate = new DateTime(2320, 5, 19, 15, 0, 30)
        }
    };
}

【讨论】:

  • 谢谢,但在你的例子中。 James T. Kirk 和 Kahn 正在讲话,我们在快捷窗口中看到两条消息,但我们应该只看到一条消息,因为我们只有一个对话。我们应该看到 1 个对话的 1 个对话快捷方式。如果有 2 个对话,我们应该看到 2 个快捷方式。这个快捷方式应该在标题上加上最后一个发件人的名字,下面是他的讲话。这就是应用程序的功能,在左侧快捷面板中。
  • 好的,这很容易解决,只需按会话名称分组即可。我已经更新了答案
  • 但是在实际项目中sessionName等于Session["username"],数据库表中没有sessionname列,如果用户以Khan登录,sessionname = "Khan",messages有没有 SessionName 头,只有一个 SenderName 和 ReceiverName。
  • 那么,什么样的信息组合将会话定义为存储在数据库中?是发送者和接收者的组合吗?如果是这样,则将组更改为GroupBy(grp =&gt; new { m.senderName, m.receiverName })。其余的都是一样的。
  • 如果发件人是Khan,如果没有答案,会有一个快捷方式为Khan,没有其他人的名字。这是个问题。在whatsapp中你看不到你的名字。而且,如果您单击您的姓名,您将看不到选择您姓名的对话的详细信息。正如我在问题中指出的那样,我已经尝试过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
相关资源
最近更新 更多