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));
        }
예제 #2
0
 private bool Equals(SelectDistinctSqlExpression distinctCountExpression)
 {
     return(base.Equals(distinctCountExpression) && Selector.Equals(distinctCountExpression.Selector));
 }