コード例 #1
0
        private static ICondition GenerateCondition(IModel conditional, ConditionalPropertyDescripor property)
        {
            //如果当前属性值为默认值,则忽略它
            if (property == null)
            {
                return(null);
            }

            //获取当前属性对应的条件命列表
            var names = GetConditionNames(property);

            //创建转换器上下文
            var context = new ConditionalConverterContext(conditional,
                                                          property.Attribute == null ? ConditionalBehaviors.None : property.Attribute.Behaviors,
                                                          names,
                                                          property.PropertyType,
                                                          property.GetValue(conditional),
                                                          property.Operator);

            //如果当前属性指定了特定的转换器,则使用该转换器来处理
            if (property.Converter != null)
            {
                return(property.Converter.Convert(context));
            }

            //使用默认转换器进行转换处理
            return(ConditionalConverter.Default.Convert(context));
        }
コード例 #2
0
        public virtual ICondition Convert(ConditionalConverterContext context)
        {
            //如果当前属性值为默认值,则忽略它
            if (this.IsDefaultValue(context))
            {
                return(null);
            }

            var opt     = context.Operator;
            var isRange = Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(ConditionalRange), context.Type);

            //只有当属性没有指定运算符并且不是区间属性,才需要生成运算符
            if (opt == null && (!isRange))
            {
                opt = ConditionOperator.Equal;

                if (context.Type == typeof(string) && context.Value != null)
                {
                    opt = ConditionOperator.Like;
                }
                else if (typeof(IEnumerable).IsAssignableFrom(context.Type) || Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(IEnumerable <>), context.Type))
                {
                    opt = ConditionOperator.In;
                }
            }

            //如果当前属性只对应一个条件
            if (context.Names.Length == 1)
            {
                if (isRange)
                {
                    return(((ConditionalRange)context.Value).ToCondition(context.Names[0]));
                }
                else
                {
                    return(new Condition(context.Names[0], (opt == ConditionOperator.Like && _wildcard != '\0' ? _wildcard + context.Value.ToString().Trim(_wildcard) + _wildcard : context.Value), opt.Value));
                }
            }

            //当一个属性对应多个条件,则这些条件之间以“或”关系进行组合
            var conditions = new ConditionCollection(ConditionCombination.Or);

            foreach (var name in context.Names)
            {
                if (isRange)
                {
                    conditions.Add(((ConditionalRange)context.Value).ToCondition(name));
                }
                else
                {
                    conditions.Add(new Condition(name, (opt == ConditionOperator.Like && _wildcard != '\0' ? _wildcard + context.Value.ToString().Trim(_wildcard) + _wildcard : context.Value), opt.Value));
                }
            }

            return(conditions);
        }
コード例 #3
0
        protected bool IsIgnorable(ConditionalConverterContext context)
        {
            if ((context.Behaviors & ConditionalBehaviors.IgnoreNull) == ConditionalBehaviors.IgnoreNull && context.Value == null)
            {
                return(true);
            }

            if ((context.Behaviors & ConditionalBehaviors.IgnoreEmpty) == ConditionalBehaviors.IgnoreEmpty && context.Type == typeof(string) && string.IsNullOrWhiteSpace((string)context.Value))
            {
                return(true);
            }

            if (IsRange(context.Type))
            {
                return(Range.IsEmpty(context.Value));
            }

            return(false);
        }
コード例 #4
0
        protected bool IsIgnorable(ConditionalConverterContext context)
        {
            if ((context.Behaviors & ConditionalBehaviors.IgnoreNull) == ConditionalBehaviors.IgnoreNull && context.Value == null)
            {
                return(true);
            }

            if ((context.Behaviors & ConditionalBehaviors.IgnoreEmpty) == ConditionalBehaviors.IgnoreEmpty && context.Type == typeof(string) && string.IsNullOrWhiteSpace((string)context.Value))
            {
                return(true);
            }

            if (typeof(IConditionalRange).IsAssignableFrom(context.Type))
            {
                return(context.Value == null || ((IConditionalRange)context.Value).HasValue == false);
            }

            return(false);
        }
コード例 #5
0
		public virtual ICondition Convert(ConditionalConverterContext context)
		{
			//如果当前属性值为默认值,则忽略它
			if(this.IsDefaultValue(context))
				return null;

			var opt = context.Operator;
			var isRange = Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(ConditionalRange), context.Type);

			//只有当属性没有指定运算符并且不是区间属性,才需要生成运算符
			if(opt == null && (!isRange))
			{
				opt = ConditionOperator.Equal;

				if(context.Type == typeof(string) && context.Value != null)
					opt = ConditionOperator.Like;
				else if(typeof(IEnumerable).IsAssignableFrom(context.Type) || Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(IEnumerable<>), context.Type))
					opt = ConditionOperator.In;
			}

			//如果当前属性只对应一个条件
			if(context.Names.Length == 1)
			{
				if(isRange)
					return ((ConditionalRange)context.Value).ToCondition(context.Names[0]);
				else
					return new Condition(context.Names[0], (opt == ConditionOperator.Like && _wildcard != '\0' ? _wildcard + context.Value.ToString().Trim(_wildcard) + _wildcard : context.Value), opt.Value);
			}

			//当一个属性对应多个条件,则这些条件之间以“或”关系进行组合
			var conditions = new ConditionCollection(ConditionCombination.Or);

			foreach(var name in context.Names)
			{
				if(isRange)
					conditions.Add(((ConditionalRange)context.Value).ToCondition(name));
				else
					conditions.Add(new Condition(name, (opt == ConditionOperator.Like && _wildcard != '\0' ? _wildcard + context.Value.ToString().Trim(_wildcard) + _wildcard : context.Value), opt.Value));
			}

			return conditions;
		}
コード例 #6
0
        protected bool IsDefaultValue(ConditionalConverterContext context)
        {
            if (Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(ConditionalRange), context.Type))
            {
                return(ConditionalRange.IsEmpty(context.Value as ConditionalRange));
            }

            if (context.Value == null || System.Convert.IsDBNull(context.Value))
            {
                return(context.DefaultValue == null || System.Convert.IsDBNull(context.DefaultValue));
            }

            if (context.DefaultValue == null)
            {
                return(false);
            }

            object defaultValue;

            return(Zongsoft.Common.Convert.TryConvertValue(context.DefaultValue, context.Value.GetType(), out defaultValue) &&
                   object.Equals(context.Value, defaultValue));
        }
コード例 #7
0
        private ICondition GenerateCondition(ConditionalPropertyDescripor property)
        {
            //如果当前属性值为默认值,则忽略它
            if (property == null)
            {
                return(null);
            }

            //获取当前属性对应的条件命列表
            var names = this.GetConditionNames(property);

            //创建转换器上下文
            var context = new ConditionalConverterContext(this, names, property.PropertyType, property.GetValue(this), property.Operator, property.DefaultValue);

            //如果当前属性指定了特定的转换器,则使用该转换器来处理
            if (property.Converter != null)
            {
                return(property.Converter.Convert(context));
            }

            //使用默认转换器进行转换处理
            return(ConditionalConverter.Default.Convert(context));
        }
コード例 #8
0
        public virtual ICondition Convert(ConditionalConverterContext context)
        {
            //判断当前属性是否可以忽略
            if (this.IsIgnorable(context))
            {
                return(null);
            }

            ICondition result = null;

            void Fallback(Func <string, Condition> factory)
            {
                if (context.Names.Length == 1)
                {
                    result = factory(context.Names[0]);
                    return;
                }

                var criteria = ConditionCollection.Or();

                foreach (var name in context.Names)
                {
                    criteria.Add(factory(name));
                }

                result = criteria;
            }

            //确定是否为区间值,如果是则返回区间条件
            if (IsRange(context.Type) && Range.HasValue(context.Value, Fallback))
            {
                return(result);
            }

            var optor = context.Operator;

            //只有当属性没有指定运算符需要确定运算符
            if (optor == null)
            {
                optor = ConditionOperator.Equal;

                if (context.Type == typeof(string) && context.Value != null)
                {
                    optor = ConditionOperator.Like;
                }
                else if (typeof(IEnumerable).IsAssignableFrom(context.Type) || Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(IEnumerable <>), context.Type))
                {
                    optor = ConditionOperator.In;
                }
            }

            //如果当前属性只对应一个条件
            if (context.Names.Length == 1)
            {
                return(new Condition(context.Names[0], this.GetValue(optor, context.Value), optor.Value));
            }

            //当一个属性对应多个条件,则这些条件之间以“或”关系进行组合
            var conditions = ConditionCollection.Or();

            foreach (var name in context.Names)
            {
                conditions.Add(new Condition(name, this.GetValue(optor, context.Value), optor.Value));
            }

            return(conditions);
        }
コード例 #9
0
		private ICondition GenerateCondition(ConditionalPropertyDescripor property)
		{
			//如果当前属性值为默认值,则忽略它
			if(property == null)
				return null;

			//获取当前属性对应的条件命列表
			var names = this.GetConditionNames(property);

			//创建转换器上下文
			var context = new ConditionalConverterContext(this, names, property.PropertyType, property.GetValue(this), property.Operator, property.DefaultValue);

			//如果当前属性指定了特定的转换器,则使用该转换器来处理
			if(property.Converter != null)
				return property.Converter.Convert(context);

			//使用默认转换器进行转换处理
			return ConditionalConverter.Default.Convert(context);
		}
コード例 #10
0
		protected bool IsDefaultValue(ConditionalConverterContext context)
		{
			if(Zongsoft.Common.TypeExtension.IsAssignableFrom(typeof(ConditionalRange), context.Type))
				return ConditionalRange.IsEmpty(context.Value as ConditionalRange);

			if(context.Value == null || System.Convert.IsDBNull(context.Value))
				return context.DefaultValue == null || System.Convert.IsDBNull(context.DefaultValue);

			if(context.DefaultValue == null)
				return false;

			object defaultValue;

			return Zongsoft.Common.Convert.TryConvertValue(context.DefaultValue, context.Value.GetType(), out defaultValue) &&
				   object.Equals(context.Value, defaultValue);
		}