/// <summary> /// 将And和Or组里面的最基本条件转化为一个IMongoQuery /// </summary> /// <param name="item"></param> /// <returns></returns> private static IMongoQuery GetQuery(DataFilter.QueryConditionInputItem item) { IMongoQuery query; BsonValue queryvalue = item.Value.GetBsonValue(); switch (item.Compare) { case DataFilter.CompareEnum.EQ: query = Query.EQ(item.ColName, queryvalue); break; case DataFilter.CompareEnum.GT: query = Query.GT(item.ColName, queryvalue); break; case DataFilter.CompareEnum.GTE: query = Query.GTE(item.ColName, queryvalue); break; case DataFilter.CompareEnum.LT: query = Query.LT(item.ColName, queryvalue); break; case DataFilter.CompareEnum.LTE: query = Query.LTE(item.ColName, queryvalue); break; case DataFilter.CompareEnum.NE: query = Query.NE(item.ColName, queryvalue); break; default: query = Query.EQ(item.ColName, queryvalue); break; } return(query); }
/// <summary> /// 通过Sql文的Where条件和列名称来获取Query条件 /// </summary> /// <param name="SqlContent">Where条件</param> /// <param name="ColumnNameLst">列名称</param> /// <returns></returns> private static List <DataFilter.QueryConditionInputItem> SetQueryCondition(String SqlContent, List <String> ColumnNameLst) { var Conditionlst = new List <DataFilter.QueryConditionInputItem>(); // (a=1 or b="A") AND c="3" => ( a = 1 or b = "A" ) and c = "3" //1. 除了引号里面的文字,全部小写 String[] KeyWord = { "(", ")", "=", "or", "and", ">", ">=", "<", "<=", "<>" }; foreach (String Keyitem in KeyWord) { SqlContent = SqlContent.Replace(Keyitem, " " + Keyitem + " "); } while (SqlContent.Contains(" ")) { SqlContent = SqlContent.Replace(" ", " "); } SqlContent = SqlContent.Trim(); //从左到右 ( a = 1 or // b = "A" ) and // c = "3" String[] Token = SqlContent.Split(" ".ToCharArray()); var mQueryConditionInputItem = new DataFilter.QueryConditionInputItem(); mQueryConditionInputItem.StartMark = String.Empty; mQueryConditionInputItem.EndMark = String.Empty; for (int i = 0; i < Token.Length; i++) { String strToken = Token[i].Replace(" ", " "); switch (strToken) { case "(": mQueryConditionInputItem.StartMark = "("; break; case "=": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.EQ; break; case ">": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.GT; break; case "<": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.LT; break; case ">=": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.GTE; break; case "<=": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.LTE; break; case "<>": mQueryConditionInputItem.Compare = DataFilter.CompareEnum.NE; break; case "or": mQueryConditionInputItem.EndMark = MongoDbHelper.EndMark_OR; Conditionlst.Add(mQueryConditionInputItem); mQueryConditionInputItem = new DataFilter.QueryConditionInputItem(); mQueryConditionInputItem.StartMark = String.Empty; mQueryConditionInputItem.EndMark = String.Empty; break; case "and": mQueryConditionInputItem.EndMark = MongoDbHelper.EndMark_AND; Conditionlst.Add(mQueryConditionInputItem); mQueryConditionInputItem = new DataFilter.QueryConditionInputItem(); mQueryConditionInputItem.StartMark = String.Empty; mQueryConditionInputItem.EndMark = String.Empty; break; case ")": mQueryConditionInputItem.EndMark = ")"; if (i == Token.Length - 1) { mQueryConditionInputItem.EndMark = MongoDbHelper.EndMark_T; } else { if (Token[i + 1] == "or") { mQueryConditionInputItem.EndMark = MongoDbHelper.EndMark_OR_T; i++; } else { if (Token[i + 1] == "and") { mQueryConditionInputItem.EndMark = MongoDbHelper.EndMark_AND_T; i++; } } } Conditionlst.Add(mQueryConditionInputItem); mQueryConditionInputItem = new DataFilter.QueryConditionInputItem(); mQueryConditionInputItem.StartMark = String.Empty; mQueryConditionInputItem.EndMark = String.Empty; break; default: if (mQueryConditionInputItem.ColName == null) { foreach (String ColName in ColumnNameLst) { if (ColName.ToLower() == strToken.ToLower()) { //小写的复原 mQueryConditionInputItem.ColName = ColName; break; } } } else { //类型设置 if (strToken.StartsWith("\"") & strToken.EndsWith("\"")) { mQueryConditionInputItem.Value = new BsonValueEx(new BsonString(strToken.Replace("\"", ""))); } else { mQueryConditionInputItem.Value = new BsonValueEx(new BsonInt32(Convert.ToInt16(strToken))); } } break; } } if (Token[Token.Length - 1] != ")") { Conditionlst.Add(mQueryConditionInputItem); } return(Conditionlst); }