private static IMongoQuery CompositeQuery(ModelInfo.SearchParamDefinition parameterDef, Operator optor, String modifier, ValueExpression operand) { if (optor == Operator.IN) { var choices = ((ChoiceValue)operand); var queries = new List <IMongoQuery>(); foreach (var choice in choices.Choices) { queries.Add(CompositeQuery(parameterDef, Operator.EQ, modifier, choice)); } return(M.Query.Or(queries)); } else if (optor == Operator.EQ) { var typedOperand = (CompositeValue)operand; var queries = new List <IMongoQuery>(); var components = typedOperand.Components; var subParams = parameterDef.CompositeParams; if (components.Count() != subParams.Count()) { throw new ArgumentException(String.Format("Parameter {0} requires exactly {1} composite values, not the currently provided {2} values.", parameterDef.Name, subParams.Count(), components.Count())); } for (int i = 0; i < subParams.Count(); i++) { var subCrit = new Criterium(); subCrit.Type = Operator.EQ; subCrit.ParamName = subParams[i]; subCrit.Operand = components[i]; subCrit.Modifier = modifier; queries.Add(subCrit.ToFilter(parameterDef.Resource)); } return(M.Query.And(queries)); } throw new ArgumentException(String.Format("Invalid operator {0} on composite parameter {1}", optor.ToString(), parameterDef.Name)); }