SQLite Xamarin - Выберите самую высокую дату каждого отдельного идентификатора (используя выражения Linq) - PullRequest
0 голосов
/ 09 апреля 2020

Привет, я создаю приложение для сообщений на Xamarin. И я использую SQLite (Asyn c) для локального хранения данных на телефоне.

У меня есть три таблицы:

  1. Контакты:

    • Имя пользователя (PK)
    • Изображение
  2. Беседы

    • ConversationID (PK)
    • LastMessage
    • Имя пользователя (FK)
  3. Сообщения

    • ID (PK)
    • Текст
    • Дата
    • Имя пользователя (FK)
    • ConversationID (FK)

У меня есть коллекция бесед, которые отображаются в ListView с использованием ObservableCollection. По сути, я хочу отсортировать их так, чтобы диалог с самым новым сообщением (самая высокая дата) появился первым.

Я попытался сделать несколько выражений Linq, чтобы решить эту проблему. К сожалению, без удачи. Я попытался получить список только самого нового объекта Message для каждого ConversationID, а затем отсортировал ObservableCollection по датам. Но я не уверен, как это сделать на практике.

        public Task<Message> GetNewestMessage()
    {

        return _database.Table<Message>().OrderByDescending(m => m.Date).FirstOrDefaultAsync();
    }

Этот метод возвращает только один элемент, который является самым новым сообщением из всех разговоров. Но я хочу один для каждого разговора.

Я также пробовал это выражение в ViewModel, где установлен контекст привязки ListViews:

Conversations.OrderBy(c => c.Messages.Max(m => m.Date));

Проблема в том, что свойство Messages в Conversation является [OneToMany], но, похоже, пусто я думаю. (Я использую Sqlite. Net. Расширения для создания отношений)

Ideal

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...