namespace Repository; public interface IEmailMessageRepository : IBaseRepository { Task ExistsAsync(string md5); /// /// 分页获取邮件列表(游标分页) /// /// 上一页最后一条记录的接收时间 /// 上一页最后一条记录的ID /// 每页数量 /// 邮件列表、最后接收时间和最后ID Task<(List list, DateTime? lastReceivedDate, long lastId)> GetPagedListAsync(DateTime? lastReceivedDate, long? lastId, int pageSize = 20); /// /// 获取总数 /// Task GetTotalCountAsync(); } public class EmailMessageRepository(IFreeSql freeSql) : BaseRepository(freeSql), IEmailMessageRepository { public async Task ExistsAsync(string md5) { return await FreeSql.Select() .Where(e => e.Md5 == md5) .FirstAsync(); } public async Task<(List list, DateTime? lastReceivedDate, long lastId)> GetPagedListAsync(DateTime? lastReceivedDate, long? lastId, int pageSize = 20) { var query = FreeSql.Select(); // 如果提供了游标,则获取小于游标位置的记录 if (lastReceivedDate.HasValue && lastId.HasValue) { query = query.Where(e => e.ReceivedDate < lastReceivedDate.Value || (e.ReceivedDate == lastReceivedDate.Value && e.Id < lastId.Value)); } var list = await query .OrderByDescending(e => e.ReceivedDate) .OrderByDescending(e => e.Id) .Page(1, pageSize) .ToListAsync(); var lastRecord = list.Count > 0 ? list.Last() : null; return (list, lastRecord?.ReceivedDate, lastRecord?.Id ?? 0); } public async Task GetTotalCountAsync() { return await FreeSql.Select().CountAsync(); } }