/// <summary>
        /// Filters a queryable to the data within a specified range partition.
        /// </summary>
        /// <typeparam name="TData">The type of the data.</typeparam>
        /// <typeparam name="TPartition">The type of the partition value.</typeparam>
        /// <param name="source">The source queryable.</param>
        /// <param name="key">A selector for the partitioned value.</param>
        /// <param name="partition">The partition.</param>
        public static IQueryable <TData> WithinPartition <TData, TPartition>(
            this IQueryable <TData> source,
            Expression <Func <TData, TPartition> > key,
            IStreamQueryRangePartition <TPartition> partition)
        {
            var lower = Expression.Constant(partition.LowerBoundExclusive);
            var upper = Expression.Constant(partition.UpperBoundInclusive);

            var compareTo = MethodInfoFor <TPartition> .CompareTo;

            var selectLeft = Expression.GreaterThan(
                Expression.Call(key.Body,
                                compareTo,
                                lower), Expression.Constant(0));

            var selectRight = Expression.LessThanOrEqual(
                Expression.Call(key.Body,
                                compareTo,
                                upper), Expression.Constant(0));

            var filterExpression = Expression.AndAlso(selectLeft, selectRight);

            return(source.Where(
                       Expression.Lambda <Func <TData, bool> >(filterExpression, key.Parameters.Single())));
        }
        /// <summary>
        /// Splits a query partition into several smaller, non-overlapping, gapless partitions.
        /// </summary>
        public static IEnumerable <IStreamQueryRangePartition <TPartition> > Among <TPartition>(
            this IStreamQueryRangePartition <TPartition> partition,
            int numberOfPartitions)
        {
            if (typeof(TPartition) == typeof(Guid))
            {
                dynamic partitions = SqlGuidPartitionBuilder.ByRange(
                    (dynamic)partition.LowerBoundExclusive,
                    (dynamic)partition.UpperBoundInclusive,
                    numberOfPartitions);
                return(partitions);
            }

            if (typeof(TPartition) == typeof(int))
            {
                dynamic partitions = Int32PartitionBuilder.ByRange(
                    (dynamic)partition.LowerBoundExclusive,
                    (dynamic)partition.UpperBoundInclusive,
                    numberOfPartitions);
                return(partitions);
            }

            if (typeof(TPartition) == typeof(long))
            {
                dynamic partitions = Int64PartitionBuilder.ByRange(
                    (dynamic)partition.LowerBoundExclusive,
                    (dynamic)partition.UpperBoundInclusive,
                    numberOfPartitions);
                return(partitions);
            }

            if (typeof(TPartition) == typeof(BigInteger))
            {
                dynamic partitions = BigIntegerPartitionBuilder.ByRange(
                    (dynamic)partition.LowerBoundExclusive,
                    (dynamic)partition.UpperBoundInclusive,
                    numberOfPartitions);
                return(partitions);
            }

            throw new ArgumentException(string.Format("Partitions of type {0} cannot be generated dynamically.", typeof(TPartition)));
        }