private static BinaryExpression IsMatch(List <KeyValuePair <string, string> > keyValuePairs, SearchCondition condition) { if (keyValuePairs == null) { return(default(BinaryExpression)); } var filterExpressions = new List <BinaryExpression>(); foreach (KeyValuePair <string, string> pair in keyValuePairs) { var kv = pair; switch (kv.Key.ToUpperInvariant()) { case "ID": if (int.TryParse(kv.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out int id)) { filterExpressions.Add(MakeBinary(kv.Key, id, Record)); } else { throw new ArgumentException($"Id '{kv.Value}' is not valid."); } break; case "FIRSTNAME": case "LASTNAME": filterExpressions.Add(MakeBinary(kv.Key, kv.Value, Record)); break; case "DATEOFBIRTH": if (DateTime.TryParse(kv.Value, out DateTime dateofbirth)) { filterExpressions.Add(MakeBinary(kv.Key, dateofbirth, Record)); } else { throw new ArgumentException($"Date of birth '{kv.Value}' is not valid."); } break; case "GENDER": if (char.TryParse(kv.Value, out char gender)) { filterExpressions.Add(MakeBinary(kv.Key, gender, Record)); } else { throw new ArgumentException($"Gender '{kv.Value}' is not valid."); } break; case "OFFICE": if (short.TryParse(kv.Value, out short office)) { filterExpressions.Add(MakeBinary(kv.Key, office, Record)); } else { throw new ArgumentException($"Office '{kv.Value}' is not valid."); } break; default: throw new InvalidOperationException( $"The {kv.Key} isn't a search parameter name. Only 'Id', 'FirstName', 'LastName', 'DateOfBirth', 'Gender' or 'Office'."); } } BinaryExpression filter = default(BinaryExpression); if (condition.Equals(SearchCondition.Or)) { filter = CombinePredicates(filterExpressions, Expression.Or); } else { filter = CombinePredicates(filterExpressions, Expression.And); } return(filter); }