Exemple #1
0
        Expression IExpressionConverter.Convert(Esprima.Ast.INode expression, ExpressionConverterContext expressionConverterContext, ExpressionConverterScope expressionConverterScope, bool allowTerminal, params Type[] genericArguments)
        {
            var(resultExpression, result) = Convert((T)expression, expressionConverterContext, expressionConverterScope, allowTerminal, genericArguments);
            if (!expressionConverterContext.IsAdmin && resultExpression != null && typeof(IEnumerable).IsAssignableFrom(resultExpression.Type) && typeof(string) != resultExpression.Type)
            {
                var underlyingType = resultExpression.Type.GetEnumerableUnderlyingType();
                var rule           = expressionConverterContext.RuleMapRegistry.GetRuleMap(underlyingType, expressionConverterContext.securityContext);
                if (rule != null && result.ShouldApplyFilter)
                {
                    var parameterExpression  = Expression.Parameter(underlyingType);
                    var permissionExpression = rule.GetInstanceCustomResolverExpression(expressionConverterContext.securityContext, parameterExpression, Permission.Read);
                    if (permissionExpression != null && permissionExpression.Type != typeof(bool))
                    {
                        permissionExpression = Expression.Convert(permissionExpression, typeof(bool));
                    }
                    if (permissionExpression != null)
                    {
                        var predicateExpression = permissionExpression;
                        var predicateLambda     = Expression.Lambda(predicateExpression, parameterExpression);
                        resultExpression = typeof(IQueryable).IsAssignableFrom(resultExpression.Type) ?
                                           Expression.Call(QueryableWhereMethodInfo.MakeGenericMethod(underlyingType), resultExpression, predicateLambda)
                                                : Expression.Call(EnumerableWhereMethodInfo.MakeGenericMethod(underlyingType), resultExpression, predicateLambda);
                    }
                }
            }
            var ruleMap = expressionConverterContext.RuleMapRegistry.GetRuleMap(resultExpression.Type, expressionConverterContext.securityContext);

            if (false && !expressionConverterContext.IsAdmin && ruleMap != null && !allowTerminal && ruleMap.RequireProjection && result.ShouldApplyProjection)
            {
                resultExpression = ruleMap.GetDefaultProjectionExpression(expressionConverterContext.securityContext, resultExpression, expressionConverterContext.RuleMaps);
            }
            return(resultExpression);
        }
Exemple #2
0
 TypeNode[] IExpressionConverter.GetRequiredGenericArgumentIndices(Esprima.Ast.INode node, Type genericTypeDefinition) => GetRequiredGenericArgumentIndices((T)node, genericTypeDefinition);
Exemple #3
0
 bool IExpressionConverter.CanHandle(Esprima.Ast.INode expression) => CanHandle((T)expression);
Exemple #4
0
 Type IExpressionConverter.GetGenericType(Esprima.Ast.INode node, Type genericTypeDefinition) => GetGenericType((T)node, genericTypeDefinition);