internal ODataSelectColumnExpression(ODataMemberAccessExpression expression, bool allColumns) // TODO FUTURE we have to pass typeof(object) here for select *. We could fix this with a "ParameterExpression" type : base(ODataExpressionKind.SelectColumn, expression != null ? expression.Type : ODataExpressionType.Complex, expression != null ? expression.ClrType : typeof(object)) { this.Expression = expression; this.AllColumns = allColumns; }
internal static ODataMemberAccessExpression MemberAccess(ODataMemberAccessExpression expression, PropertyInfo member) { Throw.IfNull(member, "member"); var finalExpression = expression != null && expression.Type == ODataExpressionType.Unknown ? ConvertFromUnknownType(expression, typeof(ODataEntity)) : expression; return(new ODataMemberAccessExpression(finalExpression, member)); }
internal static ODataSelectColumnExpression SelectColumn(ODataMemberAccessExpression memberAccess, bool allColumns) { Throw.If( allColumns && memberAccess != null && memberAccess.Type != ODataExpressionType.Complex && memberAccess.Type != ODataExpressionType.Unknown, "'*' can only be selected for non-primitive types!" ); Throw.If(memberAccess == null && !allColumns, "If no property path is specified, then '*' must be selected!"); var finalMemberAccess = allColumns && memberAccess != null && memberAccess.Type == ODataExpressionType.Unknown ? ConvertFromUnknownType(memberAccess, typeof(object)) : memberAccess; return(new ODataSelectColumnExpression(finalMemberAccess, allColumns: allColumns)); }
internal ODataMemberAccessExpression(ODataMemberAccessExpression expression, PropertyInfo member) : base(ODataExpressionKind.MemberAccess, member.PropertyType.ToODataExpressionType(), member.PropertyType) { this.Expression = expression; this.Member = member; }
protected virtual void VisitMemberAccess(ODataMemberAccessExpression node) { this.Visit(node.Expression); }
protected override void VisitMemberAccess(ODataMemberAccessExpression node) { var path = Traverse.Along(node, e => e.Expression) .Reverse() .Select(e => e.Member) .ToArray(); this._paths.Add(path); }
// TODO FUTURE we have to pass typeof(object) here for select *. We could fix this with a "ParameterExpression" type internal ODataSelectColumnExpression(ODataMemberAccessExpression expression, bool allColumns) : base(ODataExpressionKind.SelectColumn, expression != null ? expression.Type : ODataExpressionType.Complex, expression != null ? expression.ClrType : typeof(object)) { this.Expression = expression; this.AllColumns = allColumns; }
internal static ODataSelectColumnExpression SelectColumn(ODataMemberAccessExpression memberAccess, bool allColumns) { Throw.If(allColumns && memberAccess != null && memberAccess.Type != ODataExpressionType.Complex, "'*' can only be selected for non-primitive types!"); Throw.If(memberAccess == null && !allColumns, "If no property path is specified, then '*' must be selected!"); return new ODataSelectColumnExpression(memberAccess, allColumns: allColumns); }
internal static ODataMemberAccessExpression MemberAccess(ODataMemberAccessExpression expression, PropertyInfo member) { Throw.IfNull(member, "member"); return new ODataMemberAccessExpression(expression, member); }