• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / MediatR.CommandQuery / 9307610999

30 May 2024 06:43PM CUT coverage: 57.741%. Remained the same
9307610999

Pull #513

github

web-flow
Merge e90664f48 into 7184530a4
Pull Request #513: Bump Microsoft.NET.Test.Sdk from 17.9.0 to 17.10.0

348 of 708 branches covered (49.15%)

Branch coverage included in aggregate %.

1032 of 1682 relevant lines covered (61.36%)

19.52 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/MediatR.CommandQuery.Cosmos/Handlers/EntityPagedQueryHandler.cs
1
using System.Linq.Dynamic.Core;
2

3
using AutoMapper;
4

5
using Cosmos.Abstracts;
6
using Cosmos.Abstracts.Extensions;
7

8
using MediatR.CommandQuery.Extensions;
9
using MediatR.CommandQuery.Queries;
10

11
using Microsoft.Azure.Cosmos.Linq;
12
using Microsoft.Extensions.Logging;
13

14
namespace MediatR.CommandQuery.Cosmos.Handlers;
15

16
public class EntityPagedQueryHandler<TRepository, TEntity, TReadModel>
17
    : RepositoryHandlerBase<TRepository, TEntity, EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>
18
    where TRepository : ICosmosRepository<TEntity>
19
    where TEntity : class
20
{
21
    public EntityPagedQueryHandler(ILoggerFactory loggerFactory, TRepository repository, IMapper mapper)
22
        : base(loggerFactory, repository, mapper)
×
23
    {
24
    }
×
25

26
    protected override async Task<EntityPagedResult<TReadModel>> Process(EntityPagedQuery<TReadModel> request, CancellationToken cancellationToken)
27
    {
28
        if (request is null)
×
29
            throw new ArgumentNullException(nameof(request));
×
30

31
        var cosmosQuery = await Repository
×
32
            .GetQueryableAsync()
×
33
            .ConfigureAwait(false);
×
34

35
        // build query from filter
36
        var query = BuildQuery(request, cosmosQuery);
×
37

38
        // get total for query
39
        int total = await QueryTotal(request, query, cancellationToken)
×
40
            .ConfigureAwait(false);
×
41

42
        // short circuit if total is zero
43
        if (total == 0)
×
44
            return new EntityPagedResult<TReadModel> { Data = new List<TReadModel>() };
×
45

46
        // page the query and convert to read model
47
        var result = await QueryPaged(request, query, cancellationToken)
×
48
            .ConfigureAwait(false);
×
49

50
        return new EntityPagedResult<TReadModel>
×
51
        {
×
52
            Total = total,
×
53
            Data = result
×
54
        };
×
55
    }
×
56

57

58
    protected virtual IQueryable<TEntity> BuildQuery(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query)
59
    {
60
        var entityQuery = request.Query;
×
61

62
        // build query from filter
63
        if (entityQuery?.Filter != null)
×
64
            query = query.Filter(entityQuery.Filter);
×
65

66
        // add raw query
67
        if (!string.IsNullOrEmpty(entityQuery?.Query))
×
68
            query = query.Where(entityQuery.Query);
×
69

70

71
        return query;
×
72
    }
73

74
    protected virtual async Task<int> QueryTotal(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query, CancellationToken cancellationToken)
75
    {
76
        return await query
×
77
            .CountAsync(cancellationToken)
×
78
            .ConfigureAwait(false);
×
79
    }
×
80

81
    protected virtual async Task<IReadOnlyCollection<TReadModel>> QueryPaged(EntityPagedQuery<TReadModel> request, IQueryable<TEntity> query, CancellationToken cancellationToken)
82
    {
83
        var entityQuery = request.Query;
×
84

85
        var queryable = query
×
86
            .Sort(entityQuery.Sort);
×
87

88
        if (entityQuery.Page > 0 && entityQuery.PageSize > 0)
×
89
            queryable = queryable.Page(entityQuery.Page, entityQuery.PageSize);
×
90

91
        var results = await queryable
×
92
            .ToListAsync(cancellationToken)
×
93
            .ConfigureAwait(false);
×
94

95
        return Mapper.Map<IList<TEntity>, IReadOnlyCollection<TReadModel>>(results);
×
96
    }
×
97
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc