protected override ShapedQueryExpression TranslateJoin( ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector) { var joinPredicate = CreateJoinPredicate(outer, outerKeySelector, inner, innerKeySelector); if (joinPredicate != null) { var transparentIdentifierType = TransparentIdentifierFactory.Create( resultSelector.Parameters[0].Type, resultSelector.Parameters[1].Type); ((SelectExpression)outer.QueryExpression).AddInnerJoin( (SelectExpression)inner.QueryExpression, joinPredicate, transparentIdentifierType); return(TranslateResultSelectorForJoin( outer, resultSelector, inner.ShaperExpression, transparentIdentifierType, false)); } throw new NotImplementedException(); }
protected override ShapedQueryExpression TranslateSelectMany( ShapedQueryExpression source, LambdaExpression collectionSelector, LambdaExpression resultSelector) { var collectionSelectorBody = collectionSelector.Body; //var defaultIfEmpty = false; if (collectionSelectorBody is MethodCallExpression collectionEndingMethod && collectionEndingMethod.Method.IsGenericMethod && collectionEndingMethod.Method.GetGenericMethodDefinition() == _defaultIfEmptyWithoutArgMethodInfo) { //defaultIfEmpty = true; collectionSelectorBody = collectionEndingMethod.Arguments[0]; } var correlated = new CorrelationFindingExpressionVisitor().IsCorrelated(collectionSelectorBody, collectionSelector.Parameters[0]); if (correlated) { // TODO visit inner with outer parameter; throw new NotImplementedException(); } else { if (Visit(collectionSelectorBody) is ShapedQueryExpression inner) { var transparentIdentifierType = TransparentIdentifierFactory.Create( resultSelector.Parameters[0].Type, resultSelector.Parameters[1].Type); ((SelectExpression)source.QueryExpression).AddCrossJoin( (SelectExpression)inner.QueryExpression, transparentIdentifierType); return(TranslateResultSelectorForJoin( source, resultSelector, inner.ShaperExpression, transparentIdentifierType, false)); } } throw new NotImplementedException(); }