/// <summary> /// Constructs a new <see cref="CollectionPropertyAccessNode"/>. /// </summary> /// <param name="source">The value containing the property.</param> /// <param name="property">The EDM property which is to be accessed.</param> /// <exception cref="System.ArgumentNullException">Throws if the input source or property is null.</exception> /// <exception cref="ArgumentException">Throws if the input property is not a collection of structural properties</exception> public CollectionPropertyAccessNode(SingleValueNode source, IEdmProperty property) { ExceptionUtils.CheckArgumentNotNull(source, "source"); ExceptionUtils.CheckArgumentNotNull(property, "property"); if (property.PropertyKind != EdmPropertyKind.Structural) { throw new ArgumentException(ODataErrorStrings.Nodes_PropertyAccessShouldBeNonEntityProperty(property.Name)); } if (!property.Type.IsCollection()) { throw new ArgumentException(ODataErrorStrings.Nodes_PropertyAccessTypeMustBeCollection(property.Name)); } this.source = source; this.property = property; this.collectionTypeReference = property.Type.AsCollection(); this.itemType = this.collectionTypeReference.ElementType(); }
/// <summary> /// Create a BinaryOperatorNode /// </summary> /// <param name="operatorKind">The binary operator type.</param> /// <param name="left">The left operand.</param> /// <param name="right">The right operand.</param> /// <exception cref="System.ArgumentNullException">Throws if the left or right inputs are null.</exception> /// <exception cref="ODataException">Throws if the two operands don't have the same type.</exception> public BinaryOperatorNode(BinaryOperatorKind operatorKind, SingleValueNode left, SingleValueNode right) { ExceptionUtils.CheckArgumentNotNull(left, "left"); ExceptionUtils.CheckArgumentNotNull(right, "right"); this.operatorKind = operatorKind; this.left = left; this.right = right; // set the TypeReerence based on the Operands. if (this.Left == null || this.Right == null || this.Left.TypeReference == null || this.Right.TypeReference == null) { this.typeReference = null; } else { // Ensure that both operands have the same type if (!this.Left.TypeReference.Definition.IsEquivalentTo(this.Right.TypeReference.Definition)) { throw new ODataException( ODataErrorStrings.BinaryOperatorQueryNode_OperandsMustHaveSameTypes( this.Left.TypeReference.ODataFullName(), this.Right.TypeReference.ODataFullName())); } // Get a primitive type reference; this must not fail since we checked that the type is of kind 'primitive'. IEdmPrimitiveTypeReference primitiveOperatorTypeReference = this.Left.TypeReference.AsPrimitive(); this.typeReference = QueryNodeUtils.GetBinaryOperatorResultType(primitiveOperatorTypeReference, this.OperatorKind); } }