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); }
TypeNode[] IExpressionConverter.GetRequiredGenericArgumentIndices(Esprima.Ast.INode node, Type genericTypeDefinition) => GetRequiredGenericArgumentIndices((T)node, genericTypeDefinition);
bool IExpressionConverter.CanHandle(Esprima.Ast.INode expression) => CanHandle((T)expression);
Type IExpressionConverter.GetGenericType(Esprima.Ast.INode node, Type genericTypeDefinition) => GetGenericType((T)node, genericTypeDefinition);