Closed
Description
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