/// <summary> /// Parses a single query /// </summary> /// <param name="query">Query to be parsed</param> /// <returns></returns> private ObjectQueryCondition ParseSingleQuery(string query) { ObjectQueryCondition oqc; try { oqc = new ObjectQueryCondition(); //split the query string[] parts = this.SliceStringByContext(query, " ", VALUE_START_CHAR.ToString(), VALUE_END_CHAR.ToString()); if (parts.Length == QUERY_LENGTH) { oqc.FieldName = parts[0]; oqc.Operator = GetOperator(parts[1]); oqc.Value = this.Strip(parts[2]); } else if (parts.Length == EXTENDED_QUERY_LENGTH) { oqc.FieldName = parts[0]; oqc.Operator = GetOperator(parts[1]); oqc.Value = this.Strip(parts[2]); oqc.SecondaryValue = this.Strip(parts[3]); //check the operator if (oqc.Operator != CriteriaOperator.Between) { throw new ArgumentException("Invalid operator or arguments for query " + query); } } return(oqc); } catch { throw; } }
/// <summary> /// Parses the specified condition /// </summary> /// <param name="condition">object query condition</param> /// <returns>List of query conditions</returns> internal List <ObjectQueryCondition> Parse(string condition) { List <string> arguments = null; List <ObjectQueryCondition> listObjectQuery = null; List <string> listQueryComponents = null; try { arguments = new List <string>(); listObjectQuery = new List <ObjectQueryCondition>(); listQueryComponents = new List <string>(); //split the string in multiple queries string[] results = this.SliceStringByContext(condition, QUERY_SEPARATOR, VALUE_START_CHAR.ToString(), VALUE_END_CHAR.ToString()); foreach (string var in results) { //we have a conditional query. Now try to see if we have OR conditions inside it. string[] queryParts = this.SliceStringByContext(var, CONDITION_SEPARATOR, VALUE_START_CHAR.ToString(), VALUE_END_CHAR.ToString()); if (queryParts.Length > 0) { ObjectQueryCondition oqc = new ObjectQueryCondition(); for (int i = 0; i < queryParts.Length; i++) { if (i == 0) { oqc = this.ParseSingleQuery(queryParts[i]); //check if we have multiple OR queries if (queryParts.Length > 1) { //lazy initialization for "OR" list. There is no point in initializing it //for a single value oqc.ListConditions = new List <ObjectQueryCondition>(); } } else { oqc.ListConditions.Add(this.ParseSingleQuery(queryParts[i])); } } listObjectQuery.Add(oqc); } else { //we have a single condition so just add it listObjectQuery.Add(this.ParseSingleQuery(var)); } } return(listObjectQuery); } catch (Exception ex) { throw new ArgumentException(ex.Message, ex); } }