Привет, я создаю приложение для сообщений на Xamarin. И я использую SQLite (Asyn c) для локального хранения данных на телефоне.
У меня есть три таблицы:
Контакты:
- Имя пользователя (PK)
- Изображение
Беседы
- ConversationID (PK)
- LastMessage
- Имя пользователя (FK)
Сообщения
- 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. Расширения для создания отношений)