private LinqQueryOptions GetQueryOptions(QueryModel queryModel, ScalarResultBehavior scalarResultBehavior)
        {
            var queryOptions = new LinqQueryOptions(scalarResultBehavior);

            MutationState?combinedMutationState = null;

            foreach (var bodyClause in queryModel.BodyClauses)
            {
                switch (bodyClause)
                {
                case ScanConsistencyClause scanConsistency:
                    queryOptions.ScanConsistency(scanConsistency.ScanConsistency);

                    if (scanConsistency.ScanWait != null)
                    {
                        queryOptions.ScanWait(scanConsistency.ScanWait.Value);
                    }
                    break;

                case ConsistentWithClause consistentWith:
                    combinedMutationState ??= new MutationState();
                    combinedMutationState.Add(consistentWith.MutationState);

                    if (consistentWith.ScanWait != null)
                    {
                        queryOptions.ScanWait(consistentWith.ScanWait.Value);
                    }
                    break;
                }
            }

            if (combinedMutationState != null)
            {
                queryOptions.ConsistentWith(combinedMutationState);
            }

            if (QueryTimeout != null)
            {
                queryOptions.Timeout(QueryTimeout.Value);
            }

            return(queryOptions);
        }
        /// <summary>
        /// Asynchronously execute a <see cref="LinqQueryOptions"/>.
        /// </summary>
        /// <typeparam name="T">Type returned by the query.</typeparam>
        /// <param name="statement">Query to execute.</param>
        /// <param name="queryOptions">Options to control execution.</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <returns>Task which contains a list of objects returned by the request when complete.</returns>
        public async IAsyncEnumerable <T> ExecuteCollectionAsync <T>(string statement, LinqQueryOptions queryOptions,
                                                                     [EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            // TODO: Make this more efficient with a custom enumerator

            queryOptions.CancellationToken(cancellationToken);

            IAsyncEnumerable <T> result;

            if (!queryOptions.ScalarResultBehavior.ResultExtractionRequired)
            {
                result = await _cluster.QueryAsync <T>(statement, queryOptions).ConfigureAwait(false);
            }
            else
            {
                var tempResult = await _cluster.QueryAsync <ScalarResult <T> >(statement, queryOptions).ConfigureAwait(false);

                result = queryOptions.ScalarResultBehavior.ApplyResultExtraction(tempResult);
            }

            await foreach (var row in result.WithCancellation(cancellationToken).ConfigureAwait(false))
            {
                yield return(row);
            }
        }
 /// <summary>
 /// Execute a <see cref="LinqQueryOptions"/>.
 /// </summary>
 /// <typeparam name="T">Type returned by the query.</typeparam>
 /// <param name="statement">Query to execute.</param>
 /// <param name="queryOptions">Options to control execution.</param>
 /// <returns>List of objects returned by the request.</returns>
 public IEnumerable <T> ExecuteCollection <T>(string statement, LinqQueryOptions queryOptions)
 {
     return(ExecuteCollectionAsync <T>(statement, queryOptions).ToEnumerable());
 }