3

我正在编写一个类似于 WhatsApp 的消息程序。

我想显示用户和他/她的朋友之间的最后一条消息。但要做到这一点,我会在它们之间获取全部消息并使用一些查询来查找最后一条消息。我认为我可以重写一个更好的方法。因为通过这种方式,我把所有的信息都记住了。如果我有一百万条消息,那不是一个好方法

    var myID = Convert.ToInt32(txtID.Text);
    var myMessages = db.MemberMessages
        .Where(m => m.MemberTo == myID || m.MemberFrom == myID)
        .Select(s => new
            {
                s.ID,
                s.Text,
                s.MemberFrom,
                s.MemberTo
            });

    List<int> messageIDs = myMessages
        .Where(s => s.MemberTo == myID).Select(s => s.MemberFrom).Distinct().ToList();

    List<int> messageIDs2 = myMessages
        .Where(s => s.MemberFrom == myID)
        .Select(s => s.MemberTo).Distinct().ToList();

    List<int> differentIDS = messageIDs2.Except(messageIDs).ToList();

    foreach (int item in differentIDS)
    {
        messageIDs.Add(item);
    }

    foreach (int userID in messageIDs)
    {
        var deger = myMessages
            .Where(m => 
                (m.MemberFrom == myID && m.MemberTo == userID) ||
                (m.MemberFrom == userID && m.MemberTo == myID))
                .OrderByDescending(m => m.ID).ThenByDescending(m => m.MemberFrom).First();

        if (deger.MemberFrom == myID)
            lstLastMessages.Items.Add(String.Format("From Me - To ID:{0}  -  Message: {1}", deger.MemberTo, deger.Text));
        else
            lstLastMessages.Items.Add(String.Format("From ID: {0} - To: Me -Message: {1}", deger.MemberFrom, deger.Text));
    }

您可以看到用户和他/她的不同朋友之间的最后一条消息ID。是否可以用一个查询重写它?还是更短的方式?

寻求一些建议。

编辑: 在此处输入图像描述

如您所见,我在用户中有一些记录。例如,我的 ID 是 1,我想查找我之前与用户交谈的最后一条消息。

memberfrom 1 (它的我) memberfromTo : 2 。消息:xxx
memberfrom 2 (它的我) memberfromTo : 1 。留言:yyy
memberfrom 1 (它的我) memberfromTo : 2 。留言:zzzz

如果你看上面,我想得到最后一条消息是zzzz. 但我想为每个发送最后一条消息的用户这样做。

4

2 回答 2

6

只需按MemberToMemberFrom字段对消息进行分组,并从按以下顺序排序的每个组中获取最后一条消息CreationTime

var query = from m in db.MemberMessages
            where m.MemberTo == id || m.MemberFrom == id
            group m by new { m.MemberTo, m.MemberFrom } into g
            select g.OrderByDescending(x => x.CreationTime).First();

这将返回来自用户和您正在寻找的用户的最后一条消息(因为组将具有不同的键)。

更新

var query = from m in db.MemberMessages
            let msgTo = m.MemberTo == id
            let msgFrom = m.MemberFrom == id 
            where msgTo || msgFrom
            group m by msgTo ? m.MemberFrom : m.MemberTo into g
            select g.OrderByDescending(x => x.CreationTime).First();
于 2013-01-20T13:32:33.650 回答
1

如果您想要与时间相关的对话,只需添加

时间戳字段然后您可以使用OrderByDescending(s => s.Timestamp).First()

映射发件人表单/收件人之间的对话您可以在保存消息之前添加ConversationID字段,这可能比每次使用 Linq 设置操作更有效。

于 2013-01-20T13:30:39.157 回答