Аз като програмист на Питон бих го написал така
public class GetLogEntryByTimestampAndLevelHandler<TEntity> : IQueryHandler<GetLogEntryByTimestampAndLevel<TEntity>, PageResult<TEntity>> where TEntity : LogEntry
{
private readonly IMongoCollection<TEntity> _collection;
public GetLogEntryByTimestampAndLevelHandler(IMongoCollectionFactory collectionFactory)
{
_collection = collectionFactory.GetCollection<TEntity>();
}
public async Task<PageResult<TEntity>> Handle(GetLogEntryByTimestampAndLevel<TEntity> query, CancellationToken cancellationToken = default)
{
var filter = BuildFilter(query);
var fluent = _collection.Find(filter)
.SortByDescending(x => x.UtcTimeStamp)
.Skip(query.Skip ?? 0)
.Limit(query.Take ?? Constants.DefaultPageSize);
var countTask = fluent.CountDocumentsAsync(cancellationToken);
var itemsTask = fluent.ToListAsync(cancellationToken);
await Task.WhenAll(countTask, itemsTask);
return new PageResult<TEntity>
{
TotalCount = (int)await countTask,
Items = await itemsTask
};
}
private FilterDefinition<TEntity> BuildFilter(GetLogEntryByTimestampAndLevel<TEntity> query)
{
var builder = Builders<TEntity>.Filter;
var filter = builder.Empty;
if (TryParseDate(query.TimeStampFromDate, out var fromDate))
filter = builder.And(filter, builder.Gte(x => x.UtcTimeStamp, fromDate));
if (TryParseDate(query.TimeStampToDate, out var toDate))
filter = builder.And(filter, builder.Lte(x => x.UtcTimeStamp, toDate));
if (!string.IsNullOrWhiteSpace(query.Level))
filter = builder.And(filter, builder.Eq(x => x.Level, query.Level.CapitalizeFirstChar()));
return filter;
}
private bool TryParseDate(string date, out DateTime result) =>
DateTime.TryParseExact(date, Constants.DateFormat, null, System.Globalization.DateTimeStyles.AssumeUniversal, out result);
}