private static SimpleExpression CompileExpression <T>(DonationSearchCriteria donationCriteria, T amount, dynamic column)
            where T : IComparable <T>
        {
            switch (donationCriteria.SearchOperator)
            {
            case SearchOperator.EqualTo:
                return(column == amount);

            case SearchOperator.NotEqualTo:
                return(column != amount);

            case SearchOperator.GreaterThan:
                return(column > amount);

            case SearchOperator.GreaterThanOrEqualTo:
                return(column >= amount);

            case SearchOperator.LessThan:
                return(column < amount);

            case SearchOperator.LessThanOrEqualTo:
                return(column <= amount);

            default:
                throw new InvalidOperationException("Operator not valid with decimal value.");
            }
        }
        private SimpleExpression CompileTotalDonationCriteria(DonationSearchCriteria donationCriteria)
        {
            var     column = db.Members.Donations.Amount.Sum();
            decimal amount;

            if (!decimal.TryParse(donationCriteria.Value, out amount))
            {
                throw new InvalidOperationException("Cannot convert value to decimal.");
            }
            return(CompileExpression(donationCriteria, amount, column));
        }
        private SimpleExpression CompileLastDonationDate(DonationSearchCriteria donationCriteria)
        {
            var      column = db.Members.Donations.Date.Max();
            DateTime date;

            if (!DateTime.TryParse(donationCriteria.Value, out date))
            {
                throw new InvalidOperationException("Cannot convert value to date.");
            }
            return(CompileExpression(donationCriteria, date, column));
        }