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

loresoft / MediatR.CommandQuery / 11418431610

19 Oct 2024 02:43PM UTC coverage: 58.337% (+0.9%) from 57.424%
11418431610

push

github

pwelter34
add HybridCache, misc refactors

331 of 675 branches covered (49.04%)

Branch coverage included in aggregate %.

28 of 176 new or added lines in 24 files covered. (15.91%)

156 existing lines in 33 files now uncovered.

1163 of 1886 relevant lines covered (61.66%)

19.49 hits per line

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

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

3
using AutoMapper;
4
using AutoMapper.QueryableExtensions;
5

6
using MediatR.CommandQuery.Extensions;
7
using MediatR.CommandQuery.Queries;
8

9
using Microsoft.EntityFrameworkCore;
10
using Microsoft.Extensions.Logging;
11

12
namespace MediatR.CommandQuery.EntityFrameworkCore.Handlers;
13

14
public class EntityPagedQueryHandler<TContext, TEntity, TReadModel>
15
    : DataContextHandlerBase<TContext, EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>
16
    where TContext : DbContext
17
    where TEntity : class
18
{
19

20
    public EntityPagedQueryHandler(ILoggerFactory loggerFactory, TContext dataContext, IMapper mapper)
21
        : base(loggerFactory, dataContext, mapper)
14✔
22
    {
23
    }
14✔
24

25

26
    protected override async Task<EntityPagedResult<TReadModel>> Process(EntityPagedQuery<TReadModel> request, CancellationToken cancellationToken)
27
    {
28
        ArgumentNullException.ThrowIfNull(request);
14✔
29

30
        var query = DataContext
14✔
31
            .Set<TEntity>()
14✔
32
            .AsNoTracking();
14✔
33

34
        // build query from filter
35
        query = BuildQuery(request, query);
14✔
36

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

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

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

49
        return new EntityPagedResult<TReadModel>
10✔
50
        {
10✔
51
            Total = total,
10✔
52
            Data = result
10✔
53
        };
10✔
54
    }
14✔
55

56

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

61
        // build query from filter
62
        if (entityQuery?.Filter != null)
14!
63
            query = query.Filter(entityQuery.Filter);
14✔
64

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

69

70
        return query;
14✔
71
    }
72

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

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

84
        var queryable = query
10✔
85
            .Sort(entityQuery.Sort);
10✔
86

87
        if (entityQuery.Page > 0 && entityQuery.PageSize > 0)
10✔
88
            queryable = queryable.Page(entityQuery.Page, entityQuery.PageSize);
10✔
89

90
        return await queryable
10✔
91
            .ProjectTo<TReadModel>(Mapper.ConfigurationProvider)
10✔
92
            .ToListAsync(cancellationToken)
10✔
93
            .ConfigureAwait(false);
10✔
94
    }
10✔
95
}
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

© 2026 Coveralls, Inc