sql的where条件转换成mongdb筛选条件

解析字符串 filterModel1 and filterModel2 and (filterModel3 or filterModel4)

1.转换成mongo的筛选条件

 /// <summary>
        /// where转换成mongo的查询条件
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string WhereToMongoWhere(string str)
        {
            str = (str.StartsWith("(")) ? str.Substring(1) : str;
            str = (str.EndsWith(")")) ? str.Substring(0, str.Length - 1) : str;
            if (str.StartsWith("("))
            {
                str = str.Substring(1);
            }
            if (str.EndsWith(")"))
            {
                str = str.Substring(0, str.Length - 1);
            }
            var andMatch = Regex.Match(str, @"\band\b", RegexOptions.IgnoreCase);// str.search(/\band\b / i);
            var orMatch = Regex.Match(str, @"\bor\b", RegexOptions.IgnoreCase);// str.search(/\bor\b / i);
            var n = andMatch.Success ? andMatch.Index : -1;
            var n1 = orMatch.Success ? orMatch.Index : -1;
            var res_str = "";
            if (n != -1 && n1 != -1)
            {

                if (n < n1 && n != -1)
                {
                    //and
                    if (n != -1)
                    {
                        var beforeString = str.Substring(0, n).Trim();//str.slice(0, n);//截取下标0到下标n
                        var afterString = str.Substring(n + 4, str.Length - (n + 4));//str.slice(n + 4, str.length);

                        res_str = "\n    \"$and\": [{\n" + WhereToMongoWhere(beforeString) + "\n    },{" + WhereToMongoWhere(afterString) + "\n    }]"; //No I18N
                    }
                    return res_str;

                }
                else
                {
                    //or
                    if (n1 != -1)
                    {
                        var beforeString = str.Substring(0, n1).Trim();// str.slice(0, n1);
                        var afterString = str.Substring(n1 + 3, str.Length - (n1 + 3));//str.slice(n1 + 3, str.length);

                        res_str = "\n    \"$or\": [{\n" + WhereToMongoWhere(beforeString) + "\n    },{" + WhereToMongoWhere(afterString) + "\n    }]"; //No I18N
                    }
                    return res_str;
                }

            }
            else if (n1 == -1 && n != -1)
            {

                var beforeString = str.Substring(0, n).Trim();//str.slice(0, n);
                var afterString = str.Substring(n + 3, str.Length - (n + 3));//str.slice(n + 3, str.length);

                res_str = "\n    \"$and\": [{\n" + WhereToMongoWhere(beforeString) + "\n    },{" + WhereToMongoWhere(afterString) + "\n    }]"; //No I18N
                return res_str;

            }
            else if (n == -1 && n1 != -1)
            {
                var beforeString = str.Substring(0, n1).Trim();//str.slice(0, n1);
                var afterString = str.Substring(n1 + 3, str.Length - (n1 + 3));//str.slice(n1 + 3, str.length);

                res_str = "\n    \"$or\": [{\n" + WhereToMongoWhere(beforeString) + "\n    },{" + WhereToMongoWhere(afterString) + "\n    }]"; //No I18N
                return res_str;
            }
            else
            {
                res_str = " " + CheckCases(str); //No I18N
                return res_str;
            }
        }
View Code

2.筛选条件赋值

 /// <summary>
        /// 条件赋值
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static string CheckCases(string str)
        {
            string res_str = "";
            string beforeString = "";
            string afterString = "";
            FilterModel f;
            try
            {
                f = JsonConvert.DeserializeObject<FilterModel>(str);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            beforeString = f.Field.Trim();
            string valueType = f.Value.GetType().Name;
            switch (f.QueryType)
            {
                case QueryType.EQ:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\" : " + "\"" + afterString + "\"";
                    }
                    else
                    {
                        res_str = res_str + "\"" + beforeString + "\" : " + afterString;
                    }
                    break;
                case QueryType.GTE:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$gte\" : " + "\"" + afterString + "\"}"; //No I18N
                    }
                    else
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$gte\" : " + afterString + "}"; //No I18N

                    }
                    break;
                case QueryType.GT:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$gt\" : " + "\"" + afterString + "\"}"; //No I18N
                    }
                    else
                    {
                        var after = double.Parse(afterString);
                        res_str = res_str + "\"" + beforeString + "\":{ \"$gt\" : " + after + "}"; //No I18N

                    }
                    break;
                case QueryType.LTE:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$lte\" : " + "\"" + afterString + "\"}"; //No I18N
                    }
                    else
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$lte\" : " + afterString + "}"; //No I18N

                    }
                    break;
                case QueryType.LT:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$lt\" : " + "\"" + afterString + "\"}"; //No I18N
                    }
                    else
                    {
                        res_str = res_str + "\"" + beforeString + "\":{ \"$lt\" : " + afterString + "}"; //No I18N

                    }
                    break;
                case QueryType.LIKE:
                    afterString = f.Value.ToString();
                    res_str = res_str + "\"" + beforeString + "\" : " + "/" + afterString + "/"; //No I18N
                    break;
                case QueryType.IN:
                case QueryType.NE:
                    if (valueType == typeof(JArray).Name)
                    {
                        JArray jArray = JsonConvert.DeserializeObject<JArray>(JsonConvert.SerializeObject(f.Value));
                        var firstValue = jArray.FirstOrDefault();
                        if (firstValue != null)
                        {
                            if (firstValue.Type.ToString() == typeof(String).Name)
                            {
                                afterString = string.Join("\",\"", jArray.ToObject<IEnumerable<string>>());
                                afterString = "\"" + afterString + "\"";
                            }
                            else
                            {
                                afterString = string.Join(",", jArray.ToObject<IEnumerable<string>>());
                            }
                        }

                        res_str = res_str + "\"" + beforeString + "\": {"; //No I18N
                        if (f.QueryType == QueryType.IN)
                        {
                            res_str = res_str + "\"$in\": [" + afterString + "]}"; //No I18N
                        }
                        else
                        {
                            res_str = res_str + "\"$ne\": [" + afterString + "]}"; //No I18N
                        }

                    }
                    break;
                default:
                    afterString = f.Value.ToString();
                    if (valueType == typeof(string).Name)
                    {
                        res_str = res_str + "\"" + beforeString + "\" : " + "\"" + afterString + "\"";
                    }
                    else
                    {
                        res_str = res_str + "\"" + beforeString + "\" : " + afterString;
                    }
                    break;

            }
            return res_str;
        }
View Code

 

posted @ 2019-04-30 15:59  Jenny-1  阅读(372)  评论(1编辑  收藏  举报