public BaseConditionParameter(string type, IColumnObject first, IConditionRightSideObject second)
        {
            var item = typeMapping.First(t => t.Item2 == type);

            if (item == null)
            {
                throw new ParameterParseException(string.Format("Unknown condition type [{0}].", type));
            }

            ConditionType = item.Item1;
            stringFormat  = item.Item3;
            First         = first;
            Second        = second;
        }
Beispiel #2
0
        public string Build(string name, IColumnObject model, bool clear = true)
        {
            var namespaces = model.Columns
                             .Select(column => Configuration.Default.Types[column.Type].Namespace)
                             .Distinct()
                             .ToArray();

            this.builder = this.builder.AddNamespaces(namespaces)
                           .StartNamespace(nameSpace)
                           .StartClass(name, baseName);

            var type     = default(Type);
            var typeName = default(string);

            foreach (var column in model.Columns)
            {
                type     = Configuration.Default.Types[column.Type];
                typeName =
                    Configuration.Default.UseFriendlyTypeNames &&
                    Configuration.Default.FriendlyTypeNames.TryGetValue(type, out var tName)
                    ? tName
                    : type.Name;

                if (column.IsNullable && type.IsValueType)
                {
                    typeName += Symbols.QuestionMark;
                }

                this.builder = this.builder.AddProperty(column.Name, typeName);
            }

            var result = this.builder.Build();

            if (clear)
            {
                this.builder = this.builder.Clear();
            }

            return(result);
        }
        public static BaseConditionParameter TranslateByDictionary(string type, object dicObj, bool canUseAggregation)
        {
            var dic = dicObj as IDictionary <string, JToken>;

            if (dic == null)
            {
                throw new Exception("条件指令内容错误!");
            }
            IColumnObject             firstCO    = null;
            IConditionRightSideObject secondCRSO = null;
            object value = null;

            if (dic.ContainsKey("$key"))
            {
                //复杂形式
                if (!dic.ContainsKey("$value"))
                {
                    throw new Exception("条件指令复杂形式必须同时设置$key与$value值");
                }
                if (!(dic["$key"] is IDictionary <string, object>))
                {
                    throw new Exception("条件指令复杂形式$key必须为字段对象!");
                }
                var firstDic = dic["$key"] as IDictionary <string, object>;
                if (!firstDic.ContainsKey("$name"))
                {
                    throw new Exception("条件指令复杂形式$key对应的字段对象必须包含$name!");
                }

                if (canUseAggregation)
                {
                    var cco = new ComplexColumnObject()
                    {
                        Name = firstDic["$name"].ToString()
                    };
                    if (firstDic.ContainsKey("$aggregation") && firstDic["$aggregation"] != null)
                    {
                        cco.Aggregation = firstDic["$aggregation"].ToString().ToAggregationType();
                        if (cco.Aggregation == null)
                        {
                            throw new Exception("聚合指令无法识别!");
                        }
                    }
                    if (firstDic.ContainsKey("$distinct") && firstDic["$distinct"] != null)
                    {
                        cco.IsDistinct = firstDic["$distinct"].ToString().ToLower().Equals("false");
                    }
                    firstCO = cco;
                }
                else
                {
                    firstCO = new SimpleColumnObject()
                    {
                        Name = firstDic["$name"].ToString()
                    };
                }

                value = dic["$value"];
            }
            else
            {
                //简单形式
                if (dic.Keys.Count != 1)
                {
                    throw new Exception("条件指令简单形式对应的对象中不支持多字段的判断!");
                }
                firstCO = new SimpleColumnObject()
                {
                    Name = dic.Keys.First()
                };
                value = dic.First().Value;
            }

            if (value is IDictionary <string, object> )
            {
                var secondDic = value as IDictionary <string, object>;
                if (canUseAggregation)
                {
                    var cco = new ComplexColumnObject()
                    {
                        Name = secondDic["$name"].ToString()
                    };
                    if (secondDic.ContainsKey("$aggregation") && secondDic["$aggregation"] != null)
                    {
                        cco.Aggregation = secondDic["$aggregation"].ToString().ToAggregationType();
                        if (cco.Aggregation == null)
                        {
                            throw new Exception("聚合指令无法识别!");
                        }
                    }
                    if (secondDic.ContainsKey("$distinct") && secondDic["$distinct"] != null)
                    {
                        cco.IsDistinct = secondDic["$distinct"].ToString().ToLower().Equals("false");
                    }
                    secondCRSO = cco;
                }
                else
                {
                    secondCRSO = new SimpleColumnObject()
                    {
                        Name = secondDic["$name"].ToString()
                    };
                }
            }
            else
            {
                secondCRSO = new ValueObject()
                {
                    Value = value
                };
            }

            return(new BaseConditionParameter(type, firstCO, secondCRSO));
        }