Search code examples
c#.net-coreentity-framework-coredomain-driven-designcqrs

Query handlers in CQRS architectural pattern


I'm starting with CQRS and I think I'm not quite sure how (or if it's Ok to do it) to add a query that can have filtering and ordering on the result of the final query. For example:

public partial class GetParticipantListQuery : IRequest<IList<ParticipantDto>>
{
    public Expression<Func<ParticipantDto, bool>> Filter { get; set; } = null;
    public Func<IQueryable<ParticipantDto>, IQueryable<ParticipantDto>> OrderBy { get; set; } = null;
}

Then in the handler apply the filtering and ordering to the corresponding result from the DB Is this a good option? How can I achieve this kind of thing in my queries? My goal is to avoid creating one query for each filter I need, like "GetParticipantsByNameQuery", "GetParticipantsByTeamIdQuery" and so on an so forth


Solution

  • You can pass in a filter class which contains the necessary properties to filter the result.

    For example:

    public class Filter
    {
        //Property Name
        public string Key { get; set; }
        //Property Type eg. string, int, bool
        public string Type { get; set; }
        //Value to filter
        public object Value { get; set; }
    }
    
    var result = from u in _context.Set<T>() select u;
    switch(filter.Type)
    {
        case "string":
            result = result.Where(e => EF.Property<string>(e, filter.Key).Equals((string)filter.Value));
    }
    

    This is just an example for string type, you can add your own type in the switch block to filter other types.