3

私はWhatsAppのようなメッセージプログラムをコーディングしています。

ユーザーとその友達との間の最後のメッセージを表示したい。しかし、これを行うには、それらの間のメッセージ全体を取得し、クエリを使用して最後のメッセージを見つけます。より良い方法で書き直すことができると思います。そうすれば、すべてのメッセージが記憶に残るからです。100 万通のメッセージがある場合、それは適切な方法ではありません

    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。1回のクエリで書き直すことはできますか?それとももっと短い方法ですか?

アドバイスを探しています。

編集: ここに画像の説明を入力

私の表を見ると、いくつかのユーザーの記録があります。たとえば、私の 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()

送信者の Form/To 間の会話をマッピングするには メッセージを保存する前にConversationIDフィールドを追加すると、毎回 Linq の set 操作を使用するよりも効果的です。

于 2013-01-20T13:30:39.157 に答える