Как не отображать объект, если свойство уже существует в другом объекте в том же массиве. net - PullRequest
2 голосов
/ 07 мая 2020

Итак, я создаю систему обмена сообщениями. В настоящее время я нахожусь на странице «Список сообщений», мне нужно, чтобы она отображала список всех разговоров, которые ведет текущий пользователь. В настоящее время он отображает все сообщения, отправленные и полученные пользователем, как отдельные объекты внутри массива. Мне нужно, чтобы он отображал только самое последнее сообщение, которое пользователь получает для каждого разговора с другим пользователем. В приведенном ниже примере должно отображаться только 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"
    }
]

1 Ответ

1 голос
/ 07 мая 2020

Попробуйте изменить свой 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;
}
...