private Expression CreateSearchExpression(ResourceElement coverage, ResourceElement patient) { var coverageValues = _searchIndexer.Extract(coverage); var patientValues = _searchIndexer.Extract(patient); var expressions = new List <Expression>(); var reverseChainExpressions = new List <Expression>(); expressions.Add(Expression.SearchParameter(_resourceTypeSearchParameter, Expression.StringEquals(FieldName.TokenCode, null, KnownResourceTypes.Patient, false))); foreach (var patientValue in patientValues) { if (IgnoreInSearch(patientValue)) { continue; } var modifier = string.Empty; if (patientValue.SearchParameter.Type == ValueSets.SearchParamType.String) { modifier = ":exact"; } expressions.Add(_expressionParser.Parse(new[] { KnownResourceTypes.Patient }, patientValue.SearchParameter.Code + modifier, patientValue.Value.ToString())); } foreach (var coverageValue in coverageValues) { if (IgnoreInSearch(coverageValue)) { continue; } var modifier = string.Empty; if (coverageValue.SearchParameter.Type == ValueSets.SearchParamType.String) { modifier = ":exact"; } reverseChainExpressions.Add(_expressionParser.Parse(new[] { KnownResourceTypes.Coverage }, coverageValue.SearchParameter.Code + modifier, coverageValue.Value.ToString())); } if (reverseChainExpressions.Count != 0) { Expression reverseChainedExpression; if (reverseChainExpressions.Count == 1) { reverseChainedExpression = reverseChainExpressions[0]; } else { reverseChainedExpression = Expression.And(reverseChainExpressions); } var expression = Expression.Chained(new[] { KnownResourceTypes.Coverage }, _coverageBeneficiaryParameter, new[] { KnownResourceTypes.Patient }, true, reverseChainedExpression); expressions.Add(expression); } return(Expression.And(expressions)); }