// constructors
 /// <summary>
 /// Initializes a new instance of the MongoQueryable class.
 /// </summary>
 /// <param name="provider">The query provider.</param>
 public SequoiaQueryable(SequoiaQueryProvider provider)
 {
     if (provider == null)
     {
         throw new ArgumentNullException("provider");
     }
     _provider   = provider;
     _expression = Expression.Constant(this);
 }
        /// <summary>
        /// Translate a MongoDB LINQ query.
        /// </summary>
        /// <param name="provider">The MongoDB query provider.</param>
        /// <param name="expression">The LINQ query expression.</param>
        /// <returns>A TranslatedQuery.</returns>
        public static TranslatedQuery Translate(SequoiaQueryProvider provider, Expression expression)
        {
            expression = PartialEvaluator.Evaluate(expression, provider);
            expression = ExpressionNormalizer.Normalize(expression);
            // assume for now it's a SelectQuery
            var documentType = GetDocumentType(expression);
            var selectQuery  = new SelectQuery(provider.Collection, documentType);

            selectQuery.Translate(expression);
            return(selectQuery);
        }
 /// <summary>
 /// Initializes a new instance of the MongoQueryable class.
 /// </summary>
 /// <param name="provider">The query provider.</param>
 /// <param name="expression">The expression.</param>
 public SequoiaQueryable(SequoiaQueryProvider provider, Expression expression)
 {
     if (provider == null)
     {
         throw new ArgumentNullException("provider");
     }
     if (expression == null)
     {
         throw new ArgumentNullException("expression");
     }
     if (!typeof(IQueryable <T>).IsAssignableFrom(expression.Type))
     {
         throw new ArgumentOutOfRangeException("expression");
     }
     _provider   = provider;
     _expression = expression;
 }
        /// <summary>
        /// Returns an instance of IQueryable{{T}} for a MongoCollection.
        /// </summary>
        /// <typeparam name="T">The type of the returned documents.</typeparam>
        /// <param name="collection">The name of the collection.</param>
        /// <returns>An instance of IQueryable{{T}} for a MongoCollection.</returns>
        public static IQueryable <T> AsQueryable <T>(this DBCollection <T> collection)
        {
            var provider = new SequoiaQueryProvider(collection);

            return(new SequoiaQueryable <T>(provider));
        }