public Expression <Func <T, bool> > Parse(QueryDescriptor descriptor)
        {
            var query = ParseInternal(descriptor.Conditions);

            return(Expression.Lambda <Func <T, bool> >(query, parameter));
        }
        public static IQueryable <T> Query <T>(this IQueryable <T> data, QueryDescriptor descriptor, out int totalPages, out int totalCount)
        {
            totalPages = 0;
            totalCount = 0;
            var parser = new QueryExpressionParser <T>();

            //filter
            var filter = parser.Parse(descriptor);
            var result = data.Where(filter);

            //ordermuilt 多个列排序
            if (descriptor.OrderByMuilt != null)
            {
                foreach (var orderitem in descriptor.OrderByMuilt)
                {
                    Type type      = typeof(T);
                    var  parameter = Expression.Parameter(type);

                    var        propertyInfo     = type.GetProperty(orderitem.Key);
                    Expression propertySelector = Expression.Property(parameter, propertyInfo);

                    //To deal with different type of the property selector, very hacky
                    //looking for a better solution
                    if (propertyInfo.PropertyType == typeof(string))
                    {
                        var orderby = Expression.Lambda <Func <T, string> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(decimal))
                    {
                        var orderby = Expression.Lambda <Func <T, decimal> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(decimal?))
                    {
                        var orderby = Expression.Lambda <Func <T, decimal?> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(int))
                    {
                        var orderby = Expression.Lambda <Func <T, int> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(int?))
                    {
                        var orderby = Expression.Lambda <Func <T, int?> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(double))
                    {
                        var orderby = Expression.Lambda <Func <T, double> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(double?))
                    {
                        var orderby = Expression.Lambda <Func <T, double?> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(float))
                    {
                        var orderby = Expression.Lambda <Func <T, float> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(float?))
                    {
                        var orderby = Expression.Lambda <Func <T, float?> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(DateTime))
                    {
                        var orderby = Expression.Lambda <Func <T, DateTime> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                    else if (propertyInfo.PropertyType == typeof(DateTime?))
                    {
                        var orderby = Expression.Lambda <Func <T, DateTime?> >(propertySelector, parameter);
                        if (orderitem.Order == OrderSequence.DESC)
                        {
                            result = result.OrderByDescending(orderby);
                        }
                        else
                        {
                            result = result.OrderBy(orderby);
                        }
                    }
                }
            }



            //order
            if (descriptor.OrderBy != null)
            {
                Type type      = typeof(T);
                var  parameter = Expression.Parameter(type);

                var        propertyInfo     = type.GetProperty(descriptor.OrderBy.Key);
                Expression propertySelector = Expression.Property(parameter, propertyInfo);

                //To deal with different type of the property selector, very hacky
                //looking for a better solution
                if (propertyInfo.PropertyType == typeof(string))
                {
                    var orderby = Expression.Lambda <Func <T, string> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(decimal))
                {
                    var orderby = Expression.Lambda <Func <T, decimal> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(decimal?))
                {
                    var orderby = Expression.Lambda <Func <T, decimal?> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(int))
                {
                    var orderby = Expression.Lambda <Func <T, int> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(int?))
                {
                    var orderby = Expression.Lambda <Func <T, int?> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(double))
                {
                    var orderby = Expression.Lambda <Func <T, double> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(double?))
                {
                    var orderby = Expression.Lambda <Func <T, double?> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(float))
                {
                    var orderby = Expression.Lambda <Func <T, float> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(float?))
                {
                    var orderby = Expression.Lambda <Func <T, float?> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(DateTime))
                {
                    var orderby = Expression.Lambda <Func <T, DateTime> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
                else if (propertyInfo.PropertyType == typeof(DateTime?))
                {
                    var orderby = Expression.Lambda <Func <T, DateTime?> >(propertySelector, parameter);
                    if (descriptor.OrderBy.Order == OrderSequence.DESC)
                    {
                        result = result.OrderByDescending(orderby);
                    }
                    else
                    {
                        result = result.OrderBy(orderby);
                    }
                }
            }

            //paging
            //if (descriptor.PageSize > 0)
            //{
            //    totalCount = result.Count();
            //    totalPages = totalCount % descriptor.PageSize == 0 ? totalCount / descriptor.PageSize : totalCount / descriptor.PageSize + 1;
            //    //return result.Skip((descriptor.PageIndex - 1) * descriptor.PageSize).Take(descriptor.PageSize);
            //}
            return(result);
        }