private static MethodCallExpressionParseInfo CreateParseInfoWithGroupNode( MethodCallExpressionParseInfo parseInfo, LambdaExpression keySelector, LambdaExpression elementSelectorOrResultSelector, LambdaExpression resultSelectorOrNull) { var optionalElementSelector = GetOptionalElementSelector(elementSelectorOrResultSelector, resultSelectorOrNull); var sourceItemType = ReflectionUtility.GetItemTypeOfClosedGenericIEnumerable( parseInfo.ParsedExpression.Arguments[0].Type, "parseInfo.ParsedExpression.Arguments[0].Type"); MethodCallExpression simulatedGroupByCallWithoutResultSelector; if (optionalElementSelector == null) { simulatedGroupByCallWithoutResultSelector = Expression.Call( typeof(Enumerable), "GroupBy", new[] { sourceItemType, keySelector.Body.Type }, parseInfo.ParsedExpression.Arguments[0], keySelector); } else { simulatedGroupByCallWithoutResultSelector = Expression.Call( typeof(Enumerable), "GroupBy", new[] { sourceItemType, keySelector.Body.Type, optionalElementSelector.Body.Type }, parseInfo.ParsedExpression.Arguments[0], keySelector, optionalElementSelector); } var simulatedParseInfo = new MethodCallExpressionParseInfo(parseInfo.AssociatedIdentifier, parseInfo.Source, simulatedGroupByCallWithoutResultSelector); var groupBySourceNode = new GroupByExpressionNode(simulatedParseInfo, keySelector, optionalElementSelector); return(new MethodCallExpressionParseInfo(parseInfo.AssociatedIdentifier, groupBySourceNode, parseInfo.ParsedExpression)); }
private static MethodCallExpressionParseInfo CreateParseInfoWithGroupNode ( MethodCallExpressionParseInfo parseInfo, LambdaExpression keySelector, LambdaExpression elementSelectorOrResultSelector, LambdaExpression resultSelectorOrNull) { var optionalElementSelector = GetOptionalElementSelector (elementSelectorOrResultSelector, resultSelectorOrNull); var sourceItemType = ReflectionUtility.GetItemTypeOfClosedGenericIEnumerable ( parseInfo.ParsedExpression.Arguments[0].Type, "parseInfo.ParsedExpression.Arguments[0].Type"); MethodCallExpression simulatedGroupByCallWithoutResultSelector; if (optionalElementSelector == null) { simulatedGroupByCallWithoutResultSelector = Expression.Call ( typeof (Enumerable), "GroupBy", new[] { sourceItemType, keySelector.Body.Type }, parseInfo.ParsedExpression.Arguments[0], keySelector); } else { simulatedGroupByCallWithoutResultSelector = Expression.Call ( typeof (Enumerable), "GroupBy", new[] { sourceItemType, keySelector.Body.Type, optionalElementSelector.Body.Type }, parseInfo.ParsedExpression.Arguments[0], keySelector, optionalElementSelector); } var simulatedParseInfo = new MethodCallExpressionParseInfo(parseInfo.AssociatedIdentifier, parseInfo.Source, simulatedGroupByCallWithoutResultSelector); var groupBySourceNode = new GroupByExpressionNode (simulatedParseInfo, keySelector, optionalElementSelector); return new MethodCallExpressionParseInfo (parseInfo.AssociatedIdentifier, groupBySourceNode, parseInfo.ParsedExpression); }