8000 Add converter from ISpecificationBuilder<T, TResult> to ISpecificationBuilder<T> · Issue #456 · ardalis/Specification · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Add converter from ISpecificationBuilder<T, TResult> to ISpecificationBuilder<T> #456
Closed
@amyboose

Description

@amyboose

Early interface ISpecificationBuilder<T, TResult> inherited interface ISpecificationBuilder<T> and it was helpful.
Now I can't convert it.
I used it together with strategy pattern.

For example:

internal sealed class EmployeeAssessmentFlowModelSpecification : Specification<EmployeeAssessment, EmployeeAssessmentFlow>
{
    public EmployeeAssessmentFlowModelSpecification(EmployeeAssessmentFlowSearchQuery searchQuery, TimeProvider timeProvider)
    {
        FilterQueryWithLastIdStrategy filterQueryWithLastIdStrategy = new(Query);
        filterQueryWithLastIdStrategy.Apply(searchQuery, timeProvider);

        Query
            .Where()

        Query
            .Take(searchQuery.Limit + 1);

        Query
            .Select(x => new EmployeeAssessmentFlow()
            {
                Id = x.Id,
                RatingId = x.RatingId,
                AssessmentStatus = x.AssessmentStatus,
                EvaluatedEmployeeId = x.EvaluatedEmployeeId
            });
    }
}

internal sealed class EmployeeAssessmentFlowCountSpecification : Specification<EmployeeAssessment>
{
    public EmployeeAssessmentFlowCountSpecification(EmployeeAssessmentFlowSearchQuery searchQuery, TimeProvider timeProvider)
    {
        FilterQueryStrategy filterQueryStrategy = new(Query);
        filterQueryStrategy.Apply(searchQuery, timeProvider);
    }
}

internal class FilterQueryStrategy : IFilterQueryStrategy
{
    private readonly ISpecificationBuilder<EmployeeAssessment> _specificationBuilder;

    public FilterQueryStrategy(ISpecificationBuilder<EmployeeAssessment> specificationBuilder)
    {
        _specificationBuilder = specificationBuilder;
    }

    public void Apply(EmployeeAssessmentFlowSearchQuery searchQuery, TimeProvider timeProvider)
    {
        Expression<Func<EmployeeAssessment, bool>>? filterExpression = CreateExpression(searchQuery, timeProvider);
        ApplyOrdering(searchQuery.SortDirection);
        ApplyExpression(filterExpression);
    }
}

internal sealed class FilterQueryWithLastIdStrategy : FilterQueryStrategy
{
    public FilterQueryWithLastIdStrategy(ISpecificationBuilder<EmployeeAssessment> specificationBuilder)
        : base(specificationBuilder)
    {
    }

    protected override Expression<Func<EmployeeAssessment, bool>>? CreateExpression(EmployeeAssessmentFlowSearchQuery searchQuery, TimeProvider timeProvider)
    {
        Expression<Func<EmployeeAssessment, bool>>? filterExpression = base.CreateExpression(searchQuery, timeProvider);

        if (searchQuery.LastId is null)
        {
            return filterExpression;
        }

        Expression<Func<EmployeeAssessment, bool>> lastIdExpression =
            searchQuery.SortDirection == SortDirection.Ascending
            ? e => e.Id > searchQuery.LastId
            : e => e.Id < searchQuery.LastId;

        filterExpression = filterExpression is null
            ? lastIdExpression
            : filterExpression.AndAlso(lastIdExpression);

        return filterExpression;
    }
}

Now I want to convert Query (type ISpecificationBuilder<T, TResult>) from Specification to type ISpecificationBuilder<T>
Also Specification<T> is parent class for Specification<T, TResult>

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    0