我正在编写一个类似于 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
. 但我想为每个发送最后一条消息的用户这样做。