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); }