internal static object ProjectionInitializeEntity(ODataEntityMaterializer materializer, MaterializerEntry entry, Type expectedType, Type resultType, string[] properties, Func <object, object, Type, object>[] propertyValues) { if (entry.Entry == null) { throw new NullReferenceException(System.Data.Services.Client.Strings.AtomMaterializer_EntryToInitializeIsNull(resultType.FullName)); } if (!entry.EntityHasBeenResolved) { ProjectionEnsureEntryAvailableOfType(materializer, entry, resultType); } else if (!resultType.IsAssignableFrom(entry.ActualType.ElementType)) { throw new InvalidOperationException(System.Data.Services.Client.Strings.AtomMaterializer_ProjectEntityTypeMismatch(resultType.FullName, entry.ActualType.ElementType.FullName, entry.Entry.Id)); } object resolvedObject = entry.ResolvedObject; for (int i = 0; i < properties.Length; i++) { StreamDescriptor descriptor; string propertyName = properties[i]; ClientPropertyAnnotation annotation = entry.ActualType.GetProperty(propertyName, materializer.ResponseInfo.IgnoreMissingProperties); object target = propertyValues[i](materializer, entry.Entry, expectedType); ODataProperty property = (from p in entry.Entry.Properties where p.Name == propertyName select p).FirstOrDefault <ODataProperty>(); if ((((((property == null) && (entry.NavigationLinks != null)) ? (from l in entry.NavigationLinks where l.Name == propertyName select l).FirstOrDefault <ODataNavigationLink>() : null) != null) || (property != null)) || entry.EntityDescriptor.TryGetNamedStreamInfo(propertyName, out descriptor)) { if (entry.ShouldUpdateFromPayload && (annotation.EdmProperty.Type.TypeKind() == EdmTypeKind.Entity)) { materializer.Log.SetLink(entry, annotation.PropertyName, target); } if (entry.ShouldUpdateFromPayload) { if (!annotation.IsEntityCollection) { if (!annotation.IsPrimitiveOrComplexCollection) { annotation.SetValue(resolvedObject, target, annotation.PropertyName, false); } } else { IEnumerable list = (IEnumerable)target; DataServiceQueryContinuation continuation = materializer.nextLinkTable[list]; Uri nextLink = (continuation == null) ? null : continuation.NextLinkUri; ProjectionPlan plan = (continuation == null) ? null : continuation.Plan; materializer.MergeLists(entry, annotation, list, nextLink, plan); } } else if (annotation.IsEntityCollection) { materializer.FoundNextLinkForUnmodifiedCollection(annotation.GetValue(entry.ResolvedObject) as IEnumerable); } } } return(resolvedObject); }