/// <summary> /// Links specification with or condition. /// </summary> /// <param name="specification">Specification.</param> /// <returns>Specification <see cref="SpecificationBase{T}"/>.</returns> public SpecificationBase <T> Or(SpecificationBase <T> specification) { if (this == All || specification == All) { return(All); } return(new OrSpecification <T>(this, specification)); }
/// <summary> /// Links specification with and condition. /// </summary> /// <param name="specification">Specification.</param> /// <returns>Specification <see cref="SpecificationBase{T}"/>.</returns> public SpecificationBase <T> And(SpecificationBase <T> specification) { if (this == All) { return(specification); } return(specification == All ? this : new AndSpecification <T>(this, specification)); }
/// <summary> /// Filters a sequence of values based on <paramref name="specification"/>. /// </summary> /// <typeparam name="TSource">Type.</typeparam> /// <param name="source">Sequence.</param> /// <param name="specification">Specification.</param> /// <returns>An <see cref="IQueryable"/>.</returns> public static IQueryable <TSource> Where <TSource>( this IQueryable <TSource> source, SpecificationBase <TSource> specification) { return(source.Where(specification.ToExpression())); }
/// <summary> /// Initializes a new instance of the <see cref="OrSpecification{T}"/> class. /// </summary> /// <param name="left">Left specification.</param> /// <param name="right">Right specification.</param> public OrSpecification(SpecificationBase <T> left, SpecificationBase <T> right) { _left = left ?? throw new ArgumentNullException(nameof(left)); _right = right ?? throw new ArgumentNullException(nameof(right)); }
/// <summary> /// Initializes a new instance of the <see cref="NotSpecification{T}"/> class. /// </summary> /// <param name="specification">Specification.</param> public NotSpecification(SpecificationBase <T> specification) { _specification = specification; }