protected ProcessingResult GetKeys(LambdaExpression keySelector, ProcessingResult parentResult, DataContext context)
        {
            if (!parentResult.IsDeferred())
            {
                var keys             = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(keySelector.ReturnType));
                var compiledSelector = CompiledExpressionStorage.GetOrAddCompiledLambda(keySelector);

                foreach (var item in parentResult.GetItems())
                {
                    keys.Add(compiledSelector.DynamicInvoke(item));
                }

                return(new ProcessingResult(true, keys));
            }

            var nodeReferences = parentResult.GetDeferredList();
            var keysResult     = ExpressionProcessingHelper.ProcessExpression(keySelector.Body, nodeReferences, context);

            if (!keysResult.IsSuccess)
            {
                return(ProcessingResult.Unsuccessful);
            }

            if (keysResult.IsSingleItem)
            {
                keysResult = ExpressionProcessingHelper.CopyInstances(keysResult, nodeReferences.Count,
                                                                      () => ExpressionProcessingHelper.ProcessExpression(keySelector.Body, nodeReferences, context).Result);
            }

            keysResult = new ProcessingResult(true, keysResult.GetLoadedItems(keySelector.ReturnType));
            return(QueryProcessingHelper.NormalizeMultipleResult(keysResult, keySelector.ReturnType));
        }
        internal static List <ProcessingResult> ProcessArguments(IEnumerable <Expression> argumentExpressions, List <NodeReference> references, DataContext context)
        {
            var result = new List <ProcessingResult>();

            foreach (var argumentExp in argumentExpressions)
            {
                if (argumentExp.NodeType == ExpressionType.Lambda)
                {
                    try
                    {
                        var compiledLambda = CompiledExpressionStorage.GetOrAddCompiledLambda(argumentExp as LambdaExpression);
                        result.Add(new ProcessingResult(true, compiledLambda, true));
                    }
                    //exception is thrown where lambda contains references to variable from udefined scope
                    catch (InvalidOperationException)
                    {
                        result.Add(ProcessingResult.Unsuccessful);
                    }

                    continue;
                }

                var processingResult = ExpressionProcessingHelper.ProcessExpression(argumentExp, references, context);
                if (!processingResult.IsSuccess)
                {
                    result.Add(ProcessingResult.Unsuccessful);
                    return(result);
                }

                var argumentResult = processingResult.IsSingleItem
                    ? new ProcessingResult(true, processingResult.GetLoadedItem(argumentExp.Type), true)
                    : new ProcessingResult(true, processingResult.GetLoadedItems(argumentExp.Type));
                result.Add(argumentResult);
            }

            return(result);
        }