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);
        }