/// <summary>
        /// Transforms a DataTables sort object into a DapperExtensions sort element.
        /// </summary>
        /// <param name="sort"></param>
        /// <returns></returns>
        public static ISort GetSortPredicate <TElement>(this Core.IColumn column)
        {
            if (column == null)
            {
                return(null);
            }
            if (column.Sort == null)
            {
                return(null);
            }

            // Scaffolds type and searches for member (field) name.
            var typeSearchResult = TypeSearchResult.Scaffold <TElement>(column.Field);

            // Type does not contains member - returns a null sort to ensure compliance.
            if (!typeSearchResult.ContainsMember)
            {
                return(null);
            }

            return(new Sort()
            {
                Ascending = column.Sort.Direction == Core.SortDirection.Ascending, PropertyName = column.Field
            });
        }
        /// <summary>
        /// Gets the DapperExtensions filter predicate for a given column, if any search is set.
        /// Important: regex search is not supported.
        /// </summary>
        /// <typeparam name="TElement">The type of corresponding entity.</typeparam>
        /// <param name="column">The column to get search information.</param>
        /// <param name="forceEqualsOperator">Forces '==' operator for string properties.</param>
        /// <returns>The field predicate for the specified type or null.</returns>
        public static IPredicate GetFilterPredicate <TElement>(this Core.IColumn column, bool forceEqualsOperator) where TElement : class
        {
            if (column == null)
            {
                return(null);
            }
            if (!column.IsSearchable)
            {
                return(null);
            }
            if (column.Search == null)
            {
                return(null);
            }

            if (column.Search.IsRegex)
            {
                return(null);
            }

            // Scaffolds type and searches for member (field) name.
            var typeSearchResult = TypeSearchResult.Scaffold <TElement>(column.Field);

            // Type does not contains member - returns a null predicate to ensure compliance.
            if (!typeSearchResult.ContainsMember)
            {
                return(null);
            }

            // By default, 'LIKE' should be used when searching string content on database.
            // You can, however, force usage of '==' operator if desired.
            var _operator = forceEqualsOperator
                ? Operator.Eq
                : typeSearchResult.IsStringProperty
                    ? Operator.Like
                    : Operator.Eq;

            return(new FieldPredicate <TElement>()
            {
                PropertyName = column.Field, Operator = _operator, Value = column.Search.Value
            });
        }
        // https://github.com/ALMMa/datatables.aspnet/issues/58
        public static IEnumerable <T> OrderBy <T>(this IEnumerable <T> entities, Core.IColumn column)
        {
            if (!entities.Any() || column == null)
            {
                return(entities);
            }

            var propertyInfo = entities.First().GetType().GetProperty(column.Field,
                                                                      BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);

            if (propertyInfo == null)
            {
                return(entities);
            }
            if (column.Sort.Direction == SortDirection.Ascending)
            {
                return(entities.OrderBy(e => propertyInfo.GetValue(e, null)));
            }
            return(entities.OrderByDescending(e => propertyInfo.GetValue(e, null)));
        }
 /// <summary>
 /// Gets the DapperExtensions filter predicate for a given column, if any search is set.
 /// Important: regex search is not supported.
 /// </summary>
 /// <typeparam name="TElement">The type of corresponding entity.</typeparam>
 /// <param name="column">The column to get search information.</param>
 /// <returns>The field predicate for the specified type or null.</returns>
 public static IPredicate GetFilterPredicate <TElement>(this Core.IColumn column) where TElement : class
 {
     return(column.GetFilterPredicate <TElement>(false));
 }