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)); }
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)); }
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)); }
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)); }
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)); }