private static IEnumerable <string> GetOrderByClause(DataTableRequestModel pageRequestModel)
 {
     foreach (var detail in pageRequestModel.Order)
     {
         yield return(string.Format("{0} {1}", pageRequestModel.Columns[detail.Column].Data, detail.Dir));
     }
 }
 private static IEnumerable <string> GetSearchClause(DataTableRequestModel pageRequestModel)
 {
     foreach (var tableColumn in pageRequestModel.Columns)
     {
         if (tableColumn.Searchable)
         {
             yield return(string.Format("{0} LIKE @0", tableColumn.Data));
         }
     }
 }
        public static IQueryable <T> GetExpression <T>(this DataTableRequestModel pageRequestModel, IQueryable <T> query) where T : class
        {
            ParameterExpression item = Expression.Parameter(typeof(T), "item");
            Expression          previousExpression = null;

            Expression finalExpression = null;

            IQueryable <T> results = null;

            if (!string.IsNullOrEmpty(pageRequestModel.Search.Value))
            {
                foreach (var column in pageRequestModel.Columns)
                {
                    if (!column.Searchable)
                    {
                        continue;
                    }

                    if (string.IsNullOrEmpty(column.Name))
                    {
                        continue;
                    }

                    var property = Expression.Property(item,
                                                       column.Data);


                    Expression leftExpression = Expression.Property(item,
                                                                    column.Data);


                    //should not be null because we're going to do a contains..
                    bool       typeIsString  = false;
                    Expression likeneqResult = leftExpression;
                    if (property.Type == typeof(string))
                    {
                        Expression likeneqleft  = leftExpression;
                        Expression likeneqright = Expression.Constant(null);
                        likeneqResult = Expression.NotEqual(likeneqleft,
                                                            likeneqright);

                        typeIsString = true;
                    }


                    //convert to string
                    var toString      = typeof(Object).GetMethod("ToString");
                    var toStringValue = Expression.Call(leftExpression, toString);

                    //then we do a contains with IndexOf
                    var indexOf = Expression.Call(toStringValue, "IndexOf", null,
                                                  Expression.Constant(pageRequestModel.Search.Value, typeof(string)),
                                                  Expression.Constant(StringComparison.InvariantCultureIgnoreCase));
                    var like = Expression.GreaterThanOrEqual(indexOf, Expression.Constant(0));

                    //we check that the field is not null AND it contains
                    if (!typeIsString)
                    {
                        Expression likeneqright = Expression.Constant(null);
                        likeneqResult = Expression.NotEqual(toStringValue,
                                                            likeneqright);
                    }


                    Expression likeFinalExpress = Expression.AndAlso(likeneqResult,
                                                                     like);
                    if (previousExpression == null)
                    {
                        finalExpression = likeFinalExpress;
                    }
                    else
                    {
                        finalExpression = Expression.Or(finalExpression,
                                                        likeFinalExpress);
                    }

                    previousExpression = likeFinalExpress;
                }


                if (finalExpression != null)
                {
                    MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable),
                                                                               "Where",
                                                                               new Type[]
                    {
                        query.ElementType
                    },
                                                                               query.Expression,
                                                                               Expression.Lambda <Func <T, bool> >(finalExpression,
                                                                                                                   new ParameterExpression[]
                    {
                        item
                    }));

                    results = query.Provider.CreateQuery <T>(whereCallExpression);
                }
                else
                {
                    results = query;
                }
            }
            else
            {
                results = query;
            }

            if (pageRequestModel.Order.Any())
            {
                var order = pageRequestModel.Order[0];

                var column = pageRequestModel.Columns[order.Column];

                if (column.Orderable)
                {
                    if (!string.IsNullOrEmpty(column.Name))
                    {
                        var type           = typeof(T);
                        var property       = type.GetProperty(column.Data);
                        var parameter      = Expression.Parameter(type, "p");
                        var propertyAccess = Expression.MakeMemberAccess(parameter, property);
                        var orderByExp     = Expression.Lambda(propertyAccess, parameter);
                        var typeArguments  = new Type[] { type, property.PropertyType };
                        var methodName     = ("asc".Equals(order.Dir, StringComparison.CurrentCultureIgnoreCase)) ? "OrderBy" : "OrderByDescending";
                        var resultExp      = Expression.Call(typeof(Queryable), methodName, typeArguments, results.Expression, Expression.Quote(orderByExp));

                        results = results.Provider.CreateQuery <T>(resultExp);
                    }
                }
            }

            //var startPage = (pageRequestModel.Length == 0) ? 1 : pageRequestModel.Start / pageRequestModel.Length + 1;

            //return results.Skip((startPage - 1) * pageRequestModel.Length).Take(pageRequestModel.Length);

            return(results);
        }