private OeEntryFactory CreateEntryFactoryFromTuple(IEdmModel edmModel, OeEntryFactory?parentEntryFactory, OePropertyAccessor[] skipTokenAccessors) { OePropertyAccessor[] accessors = _allAccessors; if (IsTuple) { OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(edmModel.GetClrType(EntitySet), EntitySet); accessors = new OePropertyAccessor[_allAccessors.Length]; for (int i = 0; i < accessors.Length; i++) { OePropertyAccessor accessor = Array.Find(propertyAccessors, pa => pa.EdmProperty == _allAccessors[i].EdmProperty); if (Array.IndexOf(Accessors, _allAccessors[i]) == -1) { var convertExpression = (UnaryExpression)accessor.PropertyExpression.Expression; var parameterExpression = (ParameterExpression)convertExpression.Operand; accessor = OePropertyAccessor.CreatePropertyAccessor(accessor.EdmProperty, accessor.PropertyExpression, parameterExpression, true); } accessors[i] = accessor; } } var navigationLinks = new OeEntryFactory[NavigationLinks.Count]; for (int i = 0; i < NavigationLinks.Count; i++) { navigationLinks[i] = NavigationLinks[i].CreateEntryFactoryFromTuple(edmModel, this, Array.Empty <OePropertyAccessor>()); } OeEntryFactoryOptions options; if (parentEntryFactory == null) { options = new OeEntryFactoryOptions() { Accessors = accessors, EntitySet = EntitySet, NavigationLinks = navigationLinks, SkipTokenAccessors = skipTokenAccessors, }; return(new OeEntryFactory(ref options)); } ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression typedParameter = Expression.Convert(parameter, edmModel.GetClrType(parentEntryFactory.EntitySet)); MemberExpression navigationPropertyExpression = Expression.Property(typedParameter, EdmNavigationProperty.Name); LambdaExpression linkAccessor = Expression.Lambda(navigationPropertyExpression, parameter); options = new OeEntryFactoryOptions() { Accessors = accessors, EdmNavigationProperty = EdmNavigationProperty, EntitySet = EntitySet, LinkAccessor = linkAccessor, NavigationLinks = navigationLinks, NavigationSelectItem = NavigationSelectItem, SkipTokenAccessors = skipTokenAccessors, }; return(new OeEntryFactory(ref options)); }
public OeEntryFactory(ref OeEntryFactoryOptions options) : this(options.EntitySet, options.Accessors, options.SkipTokenAccessors) { _edmNavigationProperty = options.EdmNavigationProperty; LinkAccessor = options.LinkAccessor == null ? null : (Func <Object, Object>)options.LinkAccessor.Compile(); NavigationLinks = options.NavigationLinks ?? Array.Empty <OeEntryFactory>(); _navigationSelectItem = options.NavigationSelectItem; NextLink = options.NextLink; if (!options.NextLink) { _equalityComparer = new Infrastructure.OeEntryEqualityComparer(GetKeyExpressions(options.EntitySet, options.Accessors)); IsTuple |= GetIsTuple(options.LinkAccessor); } }