首页 > 解决方案 > AspNet 在请求查询时按用户名对消息进行分类

问题描述

我的数据库结构如下

public partial class AspNetUserMessage
    {
        public string From { get; set; }
        public string To { get; set; }
        public string Text { get; set; }
        public System.DateTime SentDate { get; set; }
        public Nullable<System.DateTime> ReadDate { get; set; }
        public int Id { get; set; }
    }

我有一个 API 点,它返回用户发送的所有消息,例如

[
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "i love this backend!!",
        "SentDate": "2020-04-10T00:00:00",
        "ReadDate": "2020-04-10T00:00:00",
        "Id": 1
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "this is a sample msg",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 2
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "id test",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 3
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "blocked test",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 4
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "blocked other way test",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 5
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "date test",
        "SentDate": "2020-04-11T00:00:00",
        "ReadDate": null,
        "Id": 6
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "date test",
        "SentDate": "2020-04-11T00:00:00",
        "ReadDate": null,
        "Id": 7
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "id test",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 8
    },
    {
        "From": "0617c281-5488-4009-bf37-761f6cfea2df",
        "To": "f54b7bf4-c7b5-482c-83b8-5b61e78ea398",
        "Text": "id test",
        "SentDate": "0001-01-01T00:00:00",
        "ReadDate": null,
        "Id": 9
    }
]

我的代码如下:

public IEnumerable<AspNetUserMessage> GetAllMessages([FromBody]MessageRequest Request)
        {
            try
            {
                // Get all the messages sent or received by the user
                var messages = db.AspNetUserMessages.Where(o => o.From == Request.From || o.To == Request.From).ToList();

                return messages;
            }
            catch (Exception e)
            {
                // Log the error to the database
                LogException(e);
                return null;
            }
        }

我想要做的不是返回所有消息,而是返回消息的分类版本。例如

User1 向 User2 发送了 4 条消息;

User1 向 User3 发送了 2 条消息

对于 user1 输出应该是

[
{
  "SentTo": "User2"
  "Messages": [All 4 Messages sent to User2 here]
},
{
  "SentTo": "User3"
  "Messages": [All 2 Messages sent to User3 here]
}
]

如何修改我的 GetAllMessages 函数来实现这一点

标签: asp.net-mvc

解决方案


您必须创建一个使用您的 AspNetUserMessage 的新模型并填充它。

  1. 制作一个新模型,现在我将它命名为 SentMessagesModel
public class SentMessagesModel{
  public string SentTo {get;set;}
  public List<AspNetUserMessage> Messages {get;set;}
  // All 4 Messages sent to User2 here
}
  1. 然后创建一个使用新模型的新控制器动作。使用下面的代码
public List<SentMessagesModel> GetAllMessages([FromBody]MessageRequest Request)
{
   try
   {
      // Get all the messages sent or received by the user
      var messages = db.AspNetUserMessages.Where(o => o.From == Request.From).ToList();
      var groupByTo = messages.GroupBy(m=>m.To);

      List<SentMessagesModel> sentMessages = new List<SentMessagesModel>();

      foreach(var currentGroup in groupByTo){
         sentMessages.Add(new SentMessagesModel(){ SentTo = currentGroup.Key, Messages = currentGroup.ToList() })
      }

      return sentMessages;
   }
   catch (Exception e)
   {
      // Log the error to the database
      LogException(e);
      return null;
   }
}

推荐阅读