Beispiel #1
0
        /// <summary>
        ///     Gets the expression.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="param">The parameter.</param>
        /// <param name="item">The item.</param>
        /// <returns>Expression.</returns>
        private static Expression GetExpression <T>(ParameterExpression param, ConditionItem item)
        {
            LambdaExpression exp = GetPropertyLambdaExpression <T>(item, param);

            foreach (var provider in TransformProviders.Where(provider => provider.Match(item, exp.Body.Type)))
            {
                return(GetGroupExpression <T>(param, provider.Transform(item, exp.Body.Type), Expression.AndAlso));
            }
            var constant = ChangeTypeToExpression(item, exp.Body.Type);

            return(ExpressionDict[item.Method](exp.Body, constant));
        }
Beispiel #2
0
        /// <summary>
        ///     Adds the between condition.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="beginVal">The begin value.</param>
        /// <param name="endVal">The end value.</param>
        /// <returns>SearchCondition.</returns>
        public SearchCondition AddBetweenCondition(string field, object beginVal, object endVal)
        {
            ConditionItem item = new ConditionItem
            {
                Field  = field,
                Method = QueryMethod.Between,
                Value  = new[] { beginVal, endVal }
            };

            this.Items.Add(item);

            return(this);
        }
Beispiel #3
0
        /// <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)
        {
            var arr = (item.Value as Array);

            if (arr == null)
            {
                var arrStr = item.Value.ToString();
                if (!string.IsNullOrEmpty(arrStr))
                {
                    arr = arrStr.Split(',');
                }
            }
            return(new[] { new ConditionItem(item.Field, QueryMethod.StdIn, arr) });
        }
Beispiel #4
0
        /// <summary>
        ///     Gets the property lambda expression.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="item">The item.</param>
        /// <param name="param">The parameter.</param>
        /// <returns>LambdaExpression.</returns>
        private static LambdaExpression GetPropertyLambdaExpression <T>(ConditionItem item, ParameterExpression param)
        {
            var        props          = item.Field.Split('.');
            Expression propertyAccess = param;
            var        typeOfProp     = typeof(T);
            int        i = 0;

            do
            {
                PropertyInfo property = typeOfProp.GetProperty(props[i], BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
                if (property == null)
                {
                    return(null);
                }
                typeOfProp     = property.PropertyType;
                propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);
                i++;
            } while (i < props.Length);

            return(Expression.Lambda(propertyAccess, param));
        }
Beispiel #5
0
 /// <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)
 {
     return(item.Method == QueryMethod.DateBlock);
 }
Beispiel #6
0
        /// <summary>
        ///     Gets the where string.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>System.String.</returns>
        /// <exception cref="System.Exception">Query conditions cannot be converted to date</exception>
        private string GetWhereString(ConditionItem item)
        {
            string str = "";

            switch (item.Method)
            {
            case QueryMethod.Contains:
            case QueryMethod.StdIn:
            case QueryMethod.DateTimeLessThanOrEqual:
                break;

            case QueryMethod.Equal:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} = '{1}'", item.Field, item.Value);
                //str = $"{item.Field}='{item.Value}'";
                break;

            case QueryMethod.LessThan:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} < '{1}'", item.Field, item.Value);
                //str = $"{item.Field}<'{item.Value}'";
                break;

            case QueryMethod.GreaterThan:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} > '{1}'", item.Field, item.Value);
                //str = $"{item.Field}>'{item.Value}'";
                break;

            case QueryMethod.LessThanOrEqual:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} <= '{1}'", item.Field, item.Value);
                //str = $"{item.Field}<='{item.Value}'";
                break;

            case QueryMethod.GreaterThanOrEqual:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} >= '{1}'", item.Field, item.Value);
                //str = $"{item.Field}>='{item.Value}'";
                break;

            case QueryMethod.Like:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} like '%{1}%'", item.Field, item.Value);
                //str = $"{item.Field} like '%{item.Value}%'";
                break;

            case QueryMethod.In:
                string strInValue;
                if (item.Value is ICollection)
                {
                    ICollection <string> collection = item.Value as ICollection <string>;
                    strInValue = string.Join("','", collection.ToArray());
                }
                else
                {
                    strInValue = item.Value.ToString().Replace(",", "','");
                }
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} in '{1}'", item.Field, strInValue);
                //str = $"{item.Field} in ('{strInValue}')";
                break;

            case QueryMethod.DateBlock:
                DateTime dt;
                if (!DateTime.TryParse(item.Value.ToString(), out dt))
                {
                    throw new Exception("Query conditions cannot be converted to date");
                }
                string start = dt.Date.ToString("yyyy-MM-dd");
                string end   = dt.Date.AddDays(1).ToString("yyyy-MM-dd");
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} between '{1}' and '{2}'", item.Field, start, end);
                break;

            case QueryMethod.NotEqual:
                str = string.Format("{0} <> '{1}'", item.Field, item.Value);
                //str = $"{item.Field}<>'{item.Value}'";
                break;

            case QueryMethod.StartsWith:
                str = string.Format("{0} like '{1}%'", item.Field, item.Value);
                break;

            case QueryMethod.EndsWith:
                // ReSharper disable once UseStringInterpolation
                str = string.Format("{0} like '%{1}'", item.Field, item.Value);
                break;

            case QueryMethod.Between:
                object[] objs = item.Value as object[];
                if (objs != null)
                {
                    // ReSharper disable once UseStringInterpolation
                    str = string.Format("{0} between '{1}' and '{2}'", item.Field, objs[0], objs[1]);
                }
                break;
            }

            return(str);
        }
Beispiel #7
0
 /// <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)
 {
     return(item.Method == QueryMethod.Between);
 }