私は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
です。しかし、最後のメッセージを送信したユーザーごとに実行したいと思います。