internal ICondition ToCondition(string keyword)
            {
                var conditions = new ConditionCollection(ConditionCombination.Or);

                foreach (var field in this.Fields)
                {
                    if (this.Singleton)
                    {
                        conditions.Add(Condition.Equal(field, keyword));
                    }
                    else
                    {
                        conditions.Add(Condition.Like(field, '%' + keyword + '%'));
                    }
                }

                if (conditions.Count == 1)
                {
                    return(conditions[0]);
                }
                else
                {
                    return(conditions);
                }
            }
示例#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
        private static ConditionCollection ToConditions(IModel conditional, IDictionary <string, object> changes)
        {
            if (changes == null || changes.Count == 0)
            {
                return(null);
            }

            ConditionCollection conditions = null;
            var descriptor = _cache.GetOrAdd(conditional.GetType(), type => new ConditionalDescriptor(type));

            //处理已经被更改过的属性
            foreach (var change in changes)
            {
                var condition = GenerateCondition(conditional, descriptor.Properties[change.Key]);

                if (condition != null)
                {
                    if (conditions == null)
                    {
                        conditions = ConditionCollection.And();
                    }

                    conditions.Add(condition);
                }
            }

            return(conditions);
        }
        private static ICondition ConvertToCondition(string name, object value)
        {
            if (value == null)
            {
                return(new Condition(name, null));
            }

            Type valueType = value.GetType();

            if (valueType.IsEnum)
            {
                return(new Condition(name, Zongsoft.Common.Convert.ConvertValue(value, Enum.GetUnderlyingType(valueType))));
            }

            if (valueType.IsArray || typeof(ICollection).IsAssignableFrom(valueType))
            {
                return(new Condition(name, value, ConditionOperator.In));
            }

            if (typeof(IDictionary).IsAssignableFrom(valueType))
            {
                var clauses = new ConditionCollection(ConditionCombination.Or);

                foreach (DictionaryEntry entry in (IDictionary)value)
                {
                    if (entry.Key != null)
                    {
                        clauses.Add(ConvertToCondition(entry.Key.ToString(), entry.Value));
                    }
                }

                return(clauses);
            }

            if (typeof(IDictionary <string, object>).IsAssignableFrom(valueType))
            {
                var clauses = new ConditionCollection(ConditionCombination.Or);

                foreach (var entry in (IDictionary <string, object>)value)
                {
                    if (entry.Key != null)
                    {
                        clauses.Add(ConvertToCondition(entry.Key, entry.Value));
                    }
                }

                return(clauses);
            }

            return(new Condition(name, value));
        }
        private static ConditionCollection ResolveCondition(IDictionary <string, object> condition)
        {
            if (condition == null || condition.Count < 1)
            {
                return(null);
            }

            var result = new ConditionCollection(ConditionCombination.Or);

            foreach (var parameter in condition)
            {
                result.Add(ConvertToCondition(parameter.Key, parameter.Value));
            }

            return(result);
        }
        private ICondition EnsureInquiryKey(object[] values)
        {
            if (values != null && values.Length > 3)
            {
                throw new NotSupportedException("Too many the keys.");
            }

            //获取查询键值对数组
            var items = this.GetKey(values ?? new object[0]);

            if (items == null || items.Length == 0)
            {
                return(null);
            }

            if (items.Length == 1)
            {
                if (IsNothing(items[0].Value))
                {
                    return(null);
                }

                return(items[0].Value is ICondition ? (ICondition)items[0].Value : Condition.Equal(items[0].Key, items[0].Value));
            }

            var conditions = new ConditionCollection(ConditionCombination.And);

            foreach (var item in items)
            {
                if (!IsNothing(item.Value))
                {
                    conditions.Add(item.Value is ICondition ? (ICondition)item.Value : Condition.Equal(item.Key, item.Value));
                }
            }

            if (conditions.Count > 1)
            {
                return(conditions);
            }

            return(conditions.FirstOrDefault());
        }
        private static ConditionCollection ResolveCondition(object condition)
        {
            if (condition == null)
            {
                return(null);
            }

            var properties = TypeDescriptor.GetProperties(condition);

            if (properties == null || properties.Count < 1)
            {
                return(null);
            }

            var result = new ConditionCollection(ConditionCombination.Or);

            foreach (PropertyDescriptor property in properties)
            {
                result.Add(ConvertToCondition(property.Name, property.GetValue(condition)));
            }

            return(result);
        }