Example #1
0
        public IRootSpecification <T> Or(IRootSpecification <T> specification)
        {
            if (this == All || specification == All)
            {
                return(All);
            }

            return(new OrSpecification <T>(this, specification));
        }
Example #2
0
        public IRootSpecification <T> And(IRootSpecification <T> specification)
        {
            if (this == All)
            {
                return(specification);
            }
            if (specification == All)
            {
                return(this);
            }

            return(new AndSpecification <T>(this, specification));
        }
        public static void ApplySorting(this IRootSpecification gridSpec,
                                        string sort,
                                        string orderByDescendingMethodName,
                                        string groupByMethodName)
        {
            if (string.IsNullOrEmpty(sort))
            {
                return;
            }

            const string descendingSuffix = "Desc";

            var descending   = sort.EndsWith(descendingSuffix, StringComparison.Ordinal);
            var propertyName = sort.Substring(0, 1).ToUpperInvariant() +
                               sort.Substring(1, sort.Length - 1 - (descending ? descendingSuffix.Length : 0));

            var specificationType = gridSpec.GetType().BaseType;
            var targetType        = specificationType?.GenericTypeArguments[0];
            var property          = targetType !.GetRuntimeProperty(propertyName) ??
                                    throw new InvalidOperationException($"Because the property {propertyName} does not exist it cannot be sorted.");

            var lambdaParamX = Expression.Parameter(targetType, "x");

            var propertyReturningExpression = Expression.Lambda(
                Expression.Convert(
                    Expression.Property(lambdaParamX, property),
                    typeof(object)),
                lambdaParamX);

            if (descending)
            {
                specificationType?.GetMethod(
                    orderByDescendingMethodName,
                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                ?.Invoke(gridSpec, new object[] { propertyReturningExpression });
            }
            else
            {
                specificationType?.GetMethod(
                    groupByMethodName,
                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                ?.Invoke(gridSpec, new object[] { propertyReturningExpression });
            }
        }
Example #4
0
 public OrSpecification(IRootSpecification <T> left, IRootSpecification <T> right)
 {
     _right = right as RootSpecification <T> ?? throw new InvalidCastException(nameof(right));
     _left  = left as RootSpecification <T> ?? throw new InvalidCastException(nameof(left));;
 }
Example #5
0
 public virtual async Task <List <TEntity> > FindAsync(IRootSpecification <TEntity> rootSpecification,
                                                       IAggregatSpecification <TEntity> treeSpecification = null)
 {
     return(await FindAsync(rootSpecification.ToExpression(), treeSpecification));
 }
Example #6
0
 public async Task <TEntity> FindSingleAsync(IRootSpecification <TEntity> rootSpecification
                                             , IAggregatSpecification <TEntity> treeSpecification = null)
 {
     return(await FindSingleAsync(rootSpecification.ToExpression(), treeSpecification));
 }
Example #7
0
        public IEnumerable <Movie> Find(IRootSpecification <Movie> specification)
        {
            var movies = _movieTech.AsQueryable();

            return(movies.Where(specification.ToExpression()));
        }
Example #8
0
 public AndSpecification(IRootSpecification <T> left, IRootSpecification <T> right)
 {
     _right = right as RootSpecification <T>;
     _left  = left as RootSpecification <T>;
 }