/// <summary> /// Gets the OData <see cref="ETag"/> from the given request. /// </summary> /// <param name="request">The request.</param> /// <param name="entityTagHeaderValue">The entity tag header value.</param> /// <returns>The parsed <see cref="ETag"/>.</returns> public static ETag GetETag(this HttpRequestMessage request, EntityTagHeaderValue entityTagHeaderValue) { if (request == null) { throw Error.ArgumentNull("request"); } if (entityTagHeaderValue != null) { if (entityTagHeaderValue.Equals(EntityTagHeaderValue.Any)) { return(new ETag { IsAny = true }); } HttpConfiguration configuration = request.GetConfiguration(); if (configuration == null) { throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); } // get the etag handler, and parse the etag IDictionary <string, object> properties = configuration.GetETagHandler().ParseETag(entityTagHeaderValue) ?? new Dictionary <string, object>(); IList <object> parsedETagValues = properties.Select(property => property.Value).AsList(); // get property names from request ODataPath odataPath = request.ODataProperties().Path; IEdmEntityType type = odataPath.EdmType as IEdmEntityType; if (type != null) { IList <string> concurrencyPropertyNames = type.GetConcurrencyProperties().OrderBy(c => c.Name).Select(c => c.Name).AsList(); ETag etag = new ETag(); if (parsedETagValues.Count != concurrencyPropertyNames.Count) { etag.IsWellFormed = false; } IEnumerable <KeyValuePair <string, object> > nameValues = concurrencyPropertyNames.Zip( parsedETagValues, (name, value) => new KeyValuePair <string, object>(name, value)); foreach (var nameValue in nameValues) { etag[nameValue.Key] = nameValue.Value; } return(etag); } } return(null); }
private static ISet <IEdmStructuralProperty> GetPropertiesToIncludeInQuery( SelectExpandClause selectExpandClause, IEdmEntityType entityType, out ISet <IEdmStructuralProperty> autoSelectedProperties) { autoSelectedProperties = new HashSet <IEdmStructuralProperty>(); HashSet <IEdmStructuralProperty> propertiesToInclude = new HashSet <IEdmStructuralProperty>(); IEnumerable <SelectItem> selectedItems = selectExpandClause.SelectedItems; if (!IsSelectAll(selectExpandClause)) { // only select requested properties and keys. foreach (PathSelectItem pathSelectItem in selectedItems.OfType <PathSelectItem>()) { SelectExpandNode.ValidatePathIsSupported(pathSelectItem.SelectedPath); PropertySegment structuralPropertySegment = pathSelectItem.SelectedPath.LastSegment as PropertySegment; if (structuralPropertySegment != null) { propertiesToInclude.Add(structuralPropertySegment.Property); } } // add keys foreach (IEdmStructuralProperty keyProperty in entityType.Key()) { if (!propertiesToInclude.Contains(keyProperty)) { autoSelectedProperties.Add(keyProperty); } } // add concurrency properties, if not added IEnumerable <IEdmStructuralProperty> concurrencyProperties = entityType.GetConcurrencyProperties(); foreach (IEdmStructuralProperty concurrencyProperty in concurrencyProperties) { if (!propertiesToInclude.Contains(concurrencyProperty)) { autoSelectedProperties.Add(concurrencyProperty); } } } return(propertiesToInclude); }