首页 > 解决方案 > 如果属性已存在于同一数组.net 中的另一个对象中,如何不显示对象

问题描述

所以我正在创建一个消息传递系统。我目前在“消息列表”页面上,我需要它来显示当前用户拥有的所有对话的列表。目前,它将用户发送和接收的所有消息显示为数组内的单个对象。我需要它只显示用户在与另一个用户的每次对话中收到的最新消息。在下面的示例中,它应该只显示 2 个对话,因为在 2 个示例中 senderUsername 和 recipientUsername 相同,但是它没有这样做,而是显示所有消息,而不是最近的消息。这样做的原因是因为我构建模型的方式。有什么办法可以让它做我想做的事而不改变模型

模型:

public class Messages
{
    public int Id { get; set; }
    public int SenderId { get; set; }
    public int RecipientId { get; set; }
    public string SenderUsername { get; set; }
    public string RecipientUsername { get; set; }
    public int ItemId { get; set; }
    public string Message { get; set; }
    public bool Read { get; set; }
    public DateTime DateTimeSent { get; set; }
}

代码:

    public IQueryable GetMessageList(string currentUsername)
    {
        var currentUser = _context.Users.FirstOrDefault(x => x.Username == currentUsername);

        var currentUserId = currentUser.Id;

        var messageList = _context.Messages.Where(x => x.SenderId == currentUserId || x.RecipientId == currentUserId).OrderByDescending(x => x.DateTimeSent);

        return messageList;
    }

输出:

[
    {
        "id": 4,
        "senderId": 2,
        "recipientId": 1,
        "senderUsername": "dylan_costello_",
        "recipientUsername": "jxchumber",
        "itemId": 0,
        "message": "MessagesForSendingDto.Message",
        "read": false,
        "dateTimeSent": "2020-05-07T17:47:04.5268228"
    },
    {
        "id": 3,
        "senderId": 1,
        "recipientId": 2,
        "senderUsername": "jxchumber",
        "recipientUsername": "dylan_costello_",
        "itemId": 0,
        "message": "MessagesForSendingDto.Message",
        "read": false,
        "dateTimeSent": "2020-05-07T17:39:12.4228305"
    },
    {
        "id": 2,
        "senderId": 1,
        "recipientId": 3,
        "senderUsername": "jxchumber",
        "recipientUsername": "pavster31",
        "itemId": 0,
        "message": "MessagesForSendingDto.Message",
        "read": false,
        "dateTimeSent": "2020-05-07T17:38:38.950303"
    },
    {
        "id": 1,
        "senderId": 1,
        "recipientId": 3,
        "senderUsername": "jxchumber",
        "recipientUsername": "pavster31",
        "itemId": 0,
        "message": "MessagesForSendingDto.Message",
        "read": true,
        "dateTimeSent": "2020-05-07T17:31:25.3077606"
    }
]

标签: c#.net-core

解决方案


尝试将您的 GetMessageList 更改为以下内容:

public IEnumerable<IEnumerable<Messages>> GetMessageList(string currentUsername)
{
    var currentUser = _context.Users.FirstOrDefault(x => x.Username == currentUsername);

    var currentUserId = currentUser.Id;

    var messageList = _context.Messages
                .Where(x => x.SenderId == currentUserId || x.RecipientId == currentUserId)
                .OrderByDescending(x => x.DateTimeSent)
                .ToList()
                .GroupBy(x => new
                {
                    Smaller = x.SenderId < x.RecipientId ? x.SenderId : x.RecipientId,
                    Greater = x.SenderId > x.RecipientId ? x.SenderId : x.RecipientId,
                })
                .Select(x => x.OrderByDescending(p => p.DateTimeSent).Take(2));

    return messageList;
}

推荐阅读