我制作了一个简单的消息系统,我的SQL表就像
id | from_id | to_id | text
---------------------------
1 | 10 | 11 | abc
2 | 11 | 10 | cde
3 | 10 | 11 | fgh
例如我是“用户10”,当我向“用户11”发送消息时,我必须看到我的消息框
---> 11 fgh
当用户11向我发送回复时“hij”我必须看到像
这样的结果11 hij
它就像twitter dm系统。如果我是最后一个发送邮件的人,我必须查看我发送邮件的人和我的邮件内容。
return (from data in db.user_messages.AsEnumerable()
where data.id == ((from messages in db.user_messages
where messages.from_id == data.from_id
orderby messages.message_created_at descending
select new
{
messages.id
}).Take(1).FirstOrDefault().id) &&
data.to_id == user.UserId
orderby data.message_created_at descending
select data).ToList();
使用此代码,我只能看到用户何时向我发送消息,如果我是发送最后消息的人,则无法获得任何结果。
如何改善此选择?谢谢。
答案 0 :(得分:1)
如果您想从用户的每个会话中选择最后一条消息:
from um in db.user_messages
where um.from_id == user.UserId || um.to_id == user.UserId
let otherId = (um.from_id == user.UserId) ? um.to_id : um.from_id
group um by otherId into g
select g.OrderByDescending(um => um.message_created_at).FirstOrDefault()
注意:此查询将被翻译为SQL并在数据库端执行。
显示对话可能如下所示:
foreach(var message in query.OrderBy(um => um.message_created_at))
Console.WriteLine("{0}{1}{2}",
message.from_id == user.UserId ? "--->" : "",
message.from_id == user.UserId ? message.to_id : message.from_id,
message.text);
顺便说一句,您可以从查询中选择otherId
以避免额外的ID检查。
答案 1 :(得分:0)
如果您希望收到最后一条消息
db.user_messages.Where(m =>
(m.from_id == user.UserId && m.to_id == otherUser.UserId) ||
(m.from_id == otherUser.UserId && m.to_id == user.UserId))
.OrderByDescending(m => m.message_created_at).First();