【问题标题】:Entity Framework: Get the last message from each conversation?实体框架:从每个对话中获取最后一条消息?
【发布时间】:2018-08-06 12:33:30
【问题描述】:

我的桌面聊天

id | sender   | receiver     | message      | date
1  |        1 |            2 | Hello        | 2015-12-08 20:00
2  |        2 |            1 | Hey          | 2015-12-08 20:10
3  |        2 |            1 | You there?   | 2015-12-08 21:00
4  |        1 |            3 | Yes          | 2015-12-08 21:15
5  |        4 |            1 | Hey buddy    | 2015-12-08 22:00

我的控制器

...
[HttpPost]
public async Task<JsonResult> ChatList(int person_id)
{
IEnumerable<Chat> chats = db.Chats.Where(p=>(p.sender==person_id||p.receiver==person_id));
return Json(chats);
}

如何从每个对话中获取最新消息?

【问题讨论】:

标签: c# entity-framework


【解决方案1】:
var result = db.Chats.GroupBy(c => (Math.Min(c.id1, c.id2), Math.Max(c.id1, c.id2)))
    .Where(g => g.Key.Item1 == person_id || g.Key.Item2 == person_id)
    .Select(g => g.OrderBy(c => c.date))
    .Select(g => g.Last().message);

为了提高效率,您可以将OrderBy 替换为Aggregate,这将获取O(n) 中的最新元素,但这说明了我认为的概念。

【讨论】:

  • 其中哪一个不会?我不确定Math.MinMath.Max,但如果需要,您可以仅使用? : 运算符将其重写为等效表达式。
  • 这就是我的意思,它可能会,我从来没有用这样的东西来做一个小组。
  • 我也不是,这就是我不确定的原因。无论如何(c.id1 &lt; c.id2 ? c.id1 : c.id2, c.id1 &lt; c.id2 ? c.id2 : c.id1) 肯定会工作,但答案MinMax 更具可读性:)
  • 我们在吹毛求疵,.SelectMany(g =&gt; g.OrderByDescending(d =&gt; d.Date).Take(1)) 应该更有效率
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多