Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 构建条件「与」集。
        /// </summary>
        /// <param name="criteria">指定构建条件「与」集的条件项。</param>
        /// <param name="conditions">指定构建条件「与」集的其他项集合。</param>
        /// <returns>返回构建的条件「与」集。</returns>
        public static ConditionCollection And(this ICondition criteria, ConditionCollection conditions)
        {
            if (criteria == null)
            {
                return(conditions);
            }

            return(ConditionCollection.And(Enumerate(criteria, conditions)));
        }
Ejemplo n.º 3
0
        public static ICondition Transform(this IModel criteria, string path = null)
        {
            if (criteria == null)
            {
                return(null);
            }

            var changes = criteria.GetChanges();

            if (changes == null || changes.Count == 0)
            {
                return(null);
            }

            var descriptor = _cache.GetOrAdd(criteria.GetType(), type => new CriteriaDescriptor(type));

            return(changes.Count == 1 ?
                   GetCondition(criteria, descriptor.Properties[changes.First().Key], path) :
                   ConditionCollection.And(changes.Select(p => GetCondition(criteria, descriptor.Properties[p.Key], path))));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 根据指定的查询参数值获取对应的查询<see cref="ICondition"/>条件。
        /// </summary>
        /// <param name="values">指定的查询值数组。</param>
        /// <param name="singleton">输出一个值,指示返回的查询条件执行后的结果是否为单个对象。</param>
        /// <returns>返回对应的查询<see cref="ICondition"/>条件。</returns>
        /// <remarks>
        ///		<para>基类的实现始终返回当前数据服务对应的主键的键值对数组。</para>
        /// </remarks>
        protected virtual ICondition GetKey(object[] values, out bool singleton)
        {
            //设置输出参数默认值
            singleton = false;

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

            //获取当前数据服务对应的主键
            var primaryKey = this.DataAccess.GetKey(this.Name);

            //如果主键获取失败或主键未定义或主键项数量不等于传入的数组元素个数则返回空
            if (primaryKey == null || primaryKey.Length == 0 || primaryKey.Length != values.Length)
            {
                return(null);
            }

            //匹配主键,故输出参数值为真
            singleton = true;

            //如果主键成员只有一个则返回单个条件
            if (primaryKey.Length == 1)
            {
                return(Condition.Equal(primaryKey[0], values[0]));
            }

            //创建返回的条件集(AND组合)
            var conditions = ConditionCollection.And();

            for (int i = 0; i < primaryKey.Length; i++)
            {
                conditions.Add(Condition.Equal(primaryKey[i], values[i]));
            }

            return(conditions);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 构建条件「与」集。
 /// </summary>
 /// <param name="criteria">指定构建条件「与」集的条件项。</param>
 /// <param name="conditions">指定构建条件「与」集的其他项集合。</param>
 /// <returns>返回构建的条件「与」集。</returns>
 public static ConditionCollection And(this ICondition criteria, IEnumerable <ICondition> conditions)
 {
     return(ConditionCollection.And(Enumerate(criteria, conditions)));
 }
Ejemplo n.º 6
0
 /// <summary>
 /// 构建条件「与」集。
 /// </summary>
 /// <param name="criteria">指定构建条件「与」集的条件项。</param>
 /// <param name="conditions">指定构建条件「与」集的其他项数组。</param>
 /// <returns>返回构建的条件「与」集。</returns>
 public static ConditionCollection And(this ICondition criteria, params ICondition[] conditions)
 {
     return(ConditionCollection.And(Enumerate(criteria, conditions)));
 }
Ejemplo n.º 7
0
        public static ICondition Transform(Type criteriaType, IEnumerable <KeyValuePair <string, string> > members, bool strict = true)
        {
            if (criteriaType == null)
            {
                throw new ArgumentNullException(nameof(criteriaType));
            }

            if (members == null || !members.Any())
            {
                return(null);
            }

            if (!typeof(IModel).IsAssignableFrom(criteriaType))
            {
                throw new ArgumentException($"The specified ‘{criteriaType.FullName}’ type is not a valid criteria type.");
            }

            var instance   = (IModel)(criteriaType.IsAbstract ? Model.Build(criteriaType) : Activator.CreateInstance(criteriaType));
            var descriptor = _cache.GetOrAdd(criteriaType, type => new CriteriaDescriptor(type));
            var properties = new List <CriteriaPropertyDescripor>();

            foreach (var member in members)
            {
                if (descriptor.Properties.TryGetValue(member.Key, out var property))
                {
                    properties.Add(property);

                    object propertyValue;

                    if (property.PropertyType.IsArray || property.PropertyType.IsCollection())
                    {
                        var elementType = property.PropertyType.GetElementType();
                        var parts       = member.Value.Trim('(', ')', '[', ']').Slice(',').Select(p => Common.Convert.ConvertValue(p, elementType)).ToArray();

                        if (property.PropertyType.IsArray)
                        {
                            propertyValue = Array.CreateInstance(elementType, parts.Length);
                            Array.Copy(parts, (Array)propertyValue, parts.Length);
                        }
                        else
                        {
                            propertyValue = Activator.CreateInstance(typeof(List <>).MakeGenericType(elementType));

                            for (int i = 0; i < parts.Length; i++)
                            {
                                ((System.Collections.IList)propertyValue).Add(parts[i]);
                            }
                        }
                    }
                    else
                    {
                        if ((property.PropertyType == typeof(bool) || property.PropertyType == typeof(bool?)) && string.IsNullOrEmpty(member.Value))
                        {
                            propertyValue = true;
                        }
                        else
                        {
                            propertyValue = Common.Convert.ConvertValue(member.Value, property.PropertyType);
                        }
                    }

                    Reflection.Reflector.SetValue(property.PropertyInfo, ref instance, propertyValue);
                }
                else
                {
                    if (strict)
                    {
                        throw new DataArgumentException(member.Key, $"The specified ‘{member.Key}’ condition is undefined in the '{criteriaType.FullName}' type.");
                    }
                }
            }

            if (properties.Count == 0)
            {
                return(null);
            }

            return(properties.Count == 1 ?
                   GetCondition(instance, properties[0]) :
                   ConditionCollection.And(properties.Select(p => GetCondition(instance, p))));
        }