protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { if (methodCallExpression.Object == null && methodCallExpression.Method.DeclaringType == typeof(Enumerable) && methodCallExpression.Arguments.Count == 2 && methodCallExpression.Arguments[0] is GroupByShaperExpression groupByShaperExpression && methodCallExpression.Method.Name == nameof(Enumerable.Count)) { var selectorLambda = (LambdaExpression)methodCallExpression.Arguments[1]; if (selectorLambda.Body is SelectDistinctExpression selectDistinct) { Expression selector = ReplacingExpressionVisitor.Replace(selectDistinct.Selector.Parameters[0], groupByShaperExpression.ElementSelector, selectDistinct.Selector.Body); selector = base.Visit(selector); SqlFragmentExpression distinctFragment = base.Dependencies.SqlExpressionFactory.Fragment("DISTINCT "); RelationalTypeMapping boolTypeMapping = base.Dependencies.SqlExpressionFactory.FindMapping(typeof(bool)); var selectDistinctSql = new SelectDistinctSqlExpression(selector, distinctFragment, boolTypeMapping); return(base.Dependencies.SqlExpressionFactory.Function("COUNT", new[] { selectDistinctSql }, typeof(int))); } } return(base.VisitMethodCall(methodCallExpression)); }
private bool Equals(SelectDistinctSqlExpression distinctCountExpression) { return(base.Equals(distinctCountExpression) && Selector.Equals(distinctCountExpression.Selector)); }