linq选择与group by

时间:2014-01-27 15:06:09

标签: c# sql linq

我制作了一个简单的消息系统,我的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();

使用此代码,我只能看到用户何时向我发送消息,如果我是发送最后消息的人,则无法获得任何结果。

如何改善此选择?谢谢。

2 个答案:

答案 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();