Ejemplo n.º 1
0
            protected override Expression VisitConstant(ConstantExpression node)
            {
                if (node.CheckNotNull(nameof(node)).Value.AsQueryableResourceTypeOrNull() is Type resourceType)
                {
                    var typeInfo = _typeInfoProvider.GetTypeInfo(resourceType);
                    var queryableResourceDescriptor = new QueryableResourceDescriptor(typeInfo);
                    return(new ConstantExpression(queryableResourceDescriptor));
                }

                if (node.Value is ConstantQueryArgument constantQueryArgument)
                {
                    var copy = new DynamicObject(constantQueryArgument.Value);
                    foreach (var property in copy.Properties.AsEmptyIfNull())
                    {
                        if (property.Value.AsQueryableResourceTypeOrNull() is Type resourceTypePropertyValue)
                        {
                            var typeInfo = _typeInfoProvider.GetTypeInfo(resourceTypePropertyValue);
                            var queryableResourceDescriptor = new QueryableResourceDescriptor(typeInfo);
                            property.Value = queryableResourceDescriptor;
                        }
                    }

                    return(new ConstantExpression(new ConstantQueryArgument(copy), node.Type));
                }

                if (node.Value is CancellationToken)
                {
                    var substitutionValue = new SubstitutionValue(node.Type);
                    return(new ConstantExpression(substitutionValue, node.Type));
                }

                return(base.VisitConstant(node));
            }
Ejemplo n.º 2
0
            protected override ConstantExpression VisitConstant(ConstantExpression node)
            {
                var queryable = node.CheckNotNull(nameof(node)).Value.AsQueryableOrNull();

                if (queryable != null)
                {
                    var typeInfo = _typeInfoProvider.GetTypeInfo(queryable.ElementType);
                    var queryableResourceDescriptor = new QueryableResourceDescriptor(typeInfo);
                    return(new ConstantExpression(queryableResourceDescriptor));
                }

                if (node.Value is ConstantQueryArgument constantQueryArgument)
                {
                    var newConstantQueryArgument = new ConstantQueryArgument(constantQueryArgument);
                    var properties = newConstantQueryArgument.Properties ?? Enumerable.Empty <Property>();
                    foreach (var property in properties)
                    {
                        var value = property.Value.AsQueryableOrNull();
                        if (value != null)
                        {
                            var typeInfo = _typeInfoProvider.GetTypeInfo(value.ElementType);
                            var queryableResourceDescriptor = new QueryableResourceDescriptor(typeInfo);
                            property.Value = queryableResourceDescriptor;
                        }
                    }

                    return(new ConstantExpression(newConstantQueryArgument, node.Type));
                }

                return(base.VisitConstant(node));
            }
Ejemplo n.º 3
0
            protected override ConstantExpression VisitConstant(ConstantExpression node)
            {
                var value = node.CheckNotNull(nameof(node)).Value;

                if (TryGetQueryableByQueryableResourceDescriptor(value, out var queryable))
                {
                    return(new ConstantExpression(queryable));
                }

                if (TryResolveQueryableSuorceInConstantQueryArgument(value, out var constantQueryArgument))
                {
#pragma warning disable CA1062 // Validate arguments of public methods -> false positive.
                    return(new ConstantExpression(constantQueryArgument, node.Type));

#pragma warning restore CA1062 // Validate arguments of public methods
                }

                return(base.VisitConstant(node));
            }
Ejemplo n.º 4
0
            protected override ConstantExpression VisitConstant(ConstantExpression node)
            {
                if (node.CheckNotNull(nameof(node)).Value is VariableQueryArgument nonGenericQueryArgument)
                {
                    var type          = nonGenericQueryArgument.Type.Type;
                    var value         = nonGenericQueryArgument.Value;
                    var queryArgument = Activator.CreateInstance(typeof(VariableQueryArgument <>).MakeGenericType(type), new[] { value });
                    return(new ConstantExpression(queryArgument));
                }

                if (node.Value is VariableQueryArgumentList nonGenericQueryArgumentList)
                {
                    var elementType   = nonGenericQueryArgumentList.ElementType.Type;
                    var values        = nonGenericQueryArgumentList.Values;
                    var methodInfo    = CreateVariableQueryArgumentListMethodInfo.MakeGenericMethod(elementType);
                    var queryArgument = methodInfo.Invoke(null, new object[] { values });
                    return(new ConstantExpression(queryArgument));
                }

                return(base.VisitConstant(node));
            }
Ejemplo n.º 5
0
            protected override ConstantExpression VisitConstant(ConstantExpression node)
            {
                if (IsGenericVariableQueryArgument(node.CheckNotNull(nameof(node)), out var valueType))
                {
                    var valueProperty = node.Value?.GetType().GetProperty(nameof(VariableQueryArgument <object> .Value));
                    var value         = valueProperty?.GetValue(node.Value);

                    object queryArgument;
                    if (value.IsCollection(out var collection))
                    {
                        var elementType = valueType.GetElementTypeOrThrow();
                        queryArgument = new VariableQueryArgumentList(collection, elementType);
                    }
                    else
                    {
                        queryArgument = new VariableQueryArgument(value, valueProperty?.PropertyType ?? valueType);
                    }

                    return(new ConstantExpression(queryArgument));
                }

                return(base.VisitConstant(node));
            }