public static IOrderedQueryable <T> OrderBy <T>(this IQueryable <T> query, SortableParams parameters)
        {
            var type  = typeof(T);
            var param = Expression.Parameter(type, "x");

            var pi           = GetProperty(type, parameters.OrderByField);
            var expr         = Expression.Property(param, pi);
            var propertyType = pi.PropertyType;

            var delegateType = typeof(Func <,>).MakeGenericType(type, propertyType);
            var lambda       = Expression.Lambda(delegateType, expr, param);

            var method = GetOrderByMethod(parameters.OrderByAscending);

            return((IOrderedQueryable <T>)method.MakeGenericMethod(type, propertyType)
                   .Invoke(null, new object[] { query, lambda }));
        }
        public static IOrderedQueryable <TEntity> OrderBy <TEntity>(this IQueryable <TEntity> query, SortableParams sortableParams)
        {
            var elemType  = typeof(TEntity);
            var parameter = Expression.Parameter(elemType);


            var prop = elemType.GetProperty(sortableParams.OrderByField);
            var expPropertryOrField = Expression.Property(parameter, prop.Name);

            var genType = typeof(Func <,>).MakeGenericType(elemType, prop.PropertyType);

            var selector = Expression.Lambda(expPropertryOrField, parameter);

            var orderBy = sortableParams.OrderByDesceding ? "OrderByDescending" : "OrderBy";

            var orderByExpression = Expression.Call(typeof(Queryable),
                                                    orderBy,
                                                    new[] { elemType, prop.PropertyType },
                                                    query.Expression,
                                                    selector
                                                    );

            return((IOrderedQueryable <TEntity>)query.Provider.CreateQuery <TEntity>(orderByExpression));
        }