/// <summary>
        ///     Transforms the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="type">The type.</param>
        /// <returns>IEnumerable&lt;ConditionItem&gt;.</returns>
        public IEnumerable <ConditionItem> Transform(ConditionItem item, Type type)
        {
            DateTime willTime;
            Type     instanceType = TypeUtil.GetUnNullableType(type);

            if (DateTime.TryParse(item.Value.ToString(), out willTime))
            {
                var method = item.Method;

                if (method == QueryMethod.LessThan || method == QueryMethod.LessThanOrEqual)
                {
                    method = QueryMethod.DateTimeLessThanOrEqual;
                    if (willTime.Hour == 0 && willTime.Minute == 0 && willTime.Second == 0)
                    {
                        willTime = willTime.AddDays(1).AddMilliseconds(-1);
                    }
                }
                object value = null;
                if (instanceType == typeof(DateTime))
                {
                    value = willTime;
                }
                else if (instanceType == typeof(int))
                {
                    value = (int)UnixTime.FromDateTime(willTime);
                }
                else if (instanceType == typeof(long))
                {
                    value = UnixTime.FromDateTime(willTime);
                }
                return(new[] { new ConditionItem(item.Field, method, value) });
            }

            return(new[] { new ConditionItem(item.Field, item.Method, Convert.ChangeType(item.Value, type)) });
        }
예제 #2
0
        /// <summary>
        ///     Changes the type to expression.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="conversionType">Type of the conversion.</param>
        /// <returns>Expression.</returns>
        private static Expression ChangeTypeToExpression(ConditionItem item, Type conversionType)
        {
            if (item.Value == null)
            {
                return(Expression.Constant(item.Value, conversionType));
            }

            #region 数组

            if (item.Method == QueryMethod.StdIn)
            {
                var arr     = (item.Value as Array);
                var expList = new List <Expression>();

                if (arr != null)
                {
                    expList.AddRange(arr.Cast <object>().Select((t, i) => ChangeType(arr.GetValue(i), conversionType)).Select(newValue => Expression.Constant(newValue, conversionType)));
                }
                return(Expression.NewArrayInit(conversionType, expList));
            }

            #endregion

            var elementType = TypeUtil.GetUnNullableType(conversionType);
            var value       = Convert.ChangeType(item.Value, elementType);
            return(Expression.Constant(value, conversionType));
        }
        /// <summary>
        ///     Matches the specified item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="type">The type.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool Match(ConditionItem item, Type type)
        {
            var elementType = TypeUtil.GetUnNullableType(type);

            return(((elementType == typeof(int) && !(item.Value is int)) ||
                    (elementType == typeof(long) && !(item.Value is long)) ||
                    (elementType == typeof(DateTime) && !(item.Value is DateTime))
                    ) &&
                   item.Value.ToString().Contains("-"));
        }
예제 #4
0
 /// <summary>
 ///     Changes the type.
 /// </summary>
 /// <param name="value">The value.</param>
 /// <param name="conversionType">Type of the conversion.</param>
 /// <returns>System.Object.</returns>
 private static object ChangeType(object value, Type conversionType)
 {
     return(value == null ? null : Convert.ChangeType(value, TypeUtil.GetUnNullableType(conversionType)));
 }