Exemple #1
0
        /// <summary>
        /// extension sắp xếp theo thứ tự giảm dần
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        /// created by: ntkien 01.06.2020
        public static IQueryable <T> ApplyOrderByDesc <T>(this IQueryable <T> source, string propertyName) where T : class
        {
            var expression = PropertyAccessorCache <T> .Get(propertyName);

            if (expression == null)
            {
                return(source);
            }

            MethodCallExpression resultExpression = Expression.Call(
                typeof(Queryable),
                nameof(Queryable.OrderByDescending),
                new Type[] { typeof(T), expression.ReturnType },
                source.Expression,
                Expression.Quote(expression));

            return(source.Provider.CreateQuery <T>(resultExpression));
        }
Exemple #2
0
        public static IQueryable <T> ApplyWhere <T>(this IQueryable <T> source, string propertyName, object propertyValue, ColumnTypeEnum propertyType, ExpressionOperationEnum operation) where T : class, new()
        {
            string proName = Utility.GetStandardPropertyName(new T(), propertyName);
            // 1. Retrieve member access expression
            var mba = PropertyAccessorCache <T> .Get(proName);

            if (mba == null)
            {
                return(source);
            }

            //2.Try converting value to correct type
            object value;

            //cách kiểm tra xem có phải là kiểu nullable ko?
            var    uType    = Nullable.GetUnderlyingType(mba.ReturnType);
            string typeName = (uType != null) ? uType.Name : mba.ReturnType.Name;

            try
            {
                value = Utility.ConvertValueByType(propertyValue, typeName);
            }
            catch (SystemException ex) when(
                ex is InvalidCastException ||
                ex is FormatException ||
                ex is OverflowException ||
                ex is ArgumentNullException)
            {
                return(source);
            }
            //convert

            var typeCompare = uType != null? uType:mba.ReturnType;
            var body        = Expression.Convert(mba.Body, typeCompare);
            var valExpress  = Expression.Constant(value, typeCompare);


            // 3. Construct expression tree
            Expression eqe = null;

            if (operation == ExpressionOperationEnum.Equals)
            {
                eqe = Expression.Equal(body, valExpress);
            }
            //lớn hơn
            else if (operation == ExpressionOperationEnum.GreatThan)
            {
                if (typeName.Equals("DateTime", StringComparison.OrdinalIgnoreCase))
                {
                    eqe = Expression.GreaterThan(body, Workaround_3361((DateTime)value));
                }
                else
                {
                    eqe = Expression.GreaterThan(body, valExpress);
                }
            }
            //lớn hơn hoặc bằng
            else if (operation == ExpressionOperationEnum.GreatThanEqual)
            {
                if (typeName.Equals("DateTime", StringComparison.OrdinalIgnoreCase))
                {
                    eqe = Expression.GreaterThanOrEqual(body, Workaround_3361((DateTime)value));
                }
                else
                {
                    eqe = Expression.GreaterThanOrEqual(body, valExpress);
                }
            }
            //nhỏ hơn
            else if (operation == ExpressionOperationEnum.LessThan)
            {
                if (typeName.Equals("DateTime", StringComparison.OrdinalIgnoreCase))
                {
                    eqe = Expression.LessThan(body, Workaround_3361((DateTime)value));
                }
                else
                {
                    eqe = Expression.LessThan(body, valExpress);
                }
            }
            //nhỏ hơn hoặc bằng
            else if (operation == ExpressionOperationEnum.LessThanEqual)
            {
                if (typeName.Equals("DateTime", StringComparison.OrdinalIgnoreCase))
                {
                    eqe = Expression.LessThanOrEqual(body, Workaround_3361((DateTime)value));
                }
                else
                {
                    eqe = Expression.LessThanOrEqual(body, valExpress);
                }
            }

            LambdaExpression expression = null;

            //chứa
            if (operation == ExpressionOperationEnum.Contains || operation == ExpressionOperationEnum.StartsWith || operation == ExpressionOperationEnum.EndsWith)
            {
                string methodName = "Contains";
                if (operation == ExpressionOperationEnum.StartsWith)
                {
                    methodName = "StartsWith";
                }
                else if (operation == ExpressionOperationEnum.EndsWith)
                {
                    methodName = "EndsWith";
                }
                var method        = typeof(string).GetMethod(methodName, new[] { typeof(string) });
                var valExpression = Expression.Constant(value, mba.ReturnType);
                var paramExp      = Expression.Parameter(typeof(T), "x");

                var memberExpression = Expression.Property(paramExp, propertyName);
                var methodExp        = Expression.Call(memberExpression, method, valExpression);
                expression = Expression.Lambda <Func <T, bool> >(methodExp, paramExp);
            }
            else
            {
                expression = Expression.Lambda(eqe, mba.Parameters[0]);
            }
            // 4. Construct new query
            MethodCallExpression resultExpression = Expression.Call(
                null,
                Utility.GetMethodInfo(Queryable.Where, source, (Expression <Func <T, bool> >)null),
                new Expression[] { source.Expression, Expression.Quote(expression) });

            return(source.Provider.CreateQuery <T>(resultExpression));
        }