public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySetBase entitySet, Type sourceType) { ParameterExpression parameter = Expression.Parameter(typeof(Object)); IReadOnlyList <MemberExpression> itemExpressions = OeExpressionHelper.GetPropertyExpression(Expression.Convert(parameter, sourceType)); OeEntryFactory entryFactory; List <OeEntryFactory> navigationLinks = GetNavigationLinks(itemExpressions, parameter); if (_pathSelect) { var accessors = new List <OePropertyAccessor>(_selectItemInfos.Count); for (int i = 0; i < _selectItemInfos.Count; i++) { SelectItemInfo info = _selectItemInfos[i]; if (info.EdmProperty is IEdmStructuralProperty) { accessors.Add(OePropertyAccessor.CreatePropertyAccessor(info.EdmProperty, itemExpressions[i], parameter)); } } entryFactory = OeEntryFactory.CreateEntryFactoryParent(entitySet, accessors.ToArray(), navigationLinks); } else { OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(entityType, entitySet); entryFactory = OeEntryFactory.CreateEntryFactoryParent(entitySet, accessors, navigationLinks); entryFactory.LinkAccessor = (Func <Object, Object>)Expression.Lambda(itemExpressions[0], parameter).Compile(); } return(entryFactory); }
private OeEntryFactory CreateNestedEntryFactory(Type sourceType, IEdmEntitySet entitySet, ODataNestedResourceInfo resourceInfo) { ParameterExpression parameter = Expression.Parameter(typeof(Object)); IReadOnlyList <MemberExpression> itemExpressions = OeExpressionHelper.GetPropertyExpression(Expression.Convert(parameter, sourceType)); List <OeEntryFactory> navigationLinks = GetNavigationLinks(itemExpressions, parameter); OePropertyAccessor[] accessors; if (_pathSelect) { var accessorsList = new List <OePropertyAccessor>(_selectItemInfos.Count); for (int i = 0; i < _selectItemInfos.Count; i++) { SelectItemInfo info = _selectItemInfos[i]; if (info.EdmProperty is IEdmStructuralProperty) { accessorsList.Add(OePropertyAccessor.CreatePropertyAccessor(info.EdmProperty, itemExpressions[i], parameter)); } } accessors = accessorsList.ToArray(); } else { accessors = OePropertyAccessor.CreateFromExpression(itemExpressions[0], parameter, entitySet); } return(OeEntryFactory.CreateEntryFactoryNested(entitySet, accessors, resourceInfo, navigationLinks)); }
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 static OePropertyAccessor[] GetAccessors(Expression source, OrderByClause orderByClause, Translators.OeJoinBuilder joinBuilder) { var accessors = new List <OePropertyAccessor>(); ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression instance = Expression.Convert(parameter, OeExpressionHelper.GetCollectionItemType(source.Type)); while (orderByClause != null) { var propertyNode = (SingleValuePropertyAccessNode)orderByClause.Expression; MemberExpression propertyExpression = joinBuilder.GetJoinPropertyExpression(source, instance, propertyNode); accessors.Add(OePropertyAccessor.CreatePropertyAccessor(propertyNode.Property, propertyExpression, parameter, true)); orderByClause = orderByClause.ThenBy; } return(accessors.ToArray()); }
public static OePropertyAccessor[] GetAccessors(Expression source, OrderByClause orderByClause, Translators.OeJoinBuilder joinBuilder) { var accessors = new List <OePropertyAccessor>(); ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression instance = Expression.Convert(parameter, OeExpressionHelper.GetCollectionItemType(source.Type)); while (orderByClause != null) { MemberExpression propertyExpression = Translators.OeOrderByTranslator.GetPropertyExpression(joinBuilder, source, instance, orderByClause.Expression); IEdmStructuralProperty edmProperty = GetEdmProperty(orderByClause.Expression, propertyExpression.Type); accessors.Add(OePropertyAccessor.CreatePropertyAccessor(edmProperty, propertyExpression, parameter, true)); orderByClause = orderByClause.ThenBy; } return(accessors.ToArray()); }
public static OePropertyAccessor[] GetAccessors(Expression source, OrderByClause orderByClause, Translators.OeJoinBuilder joinBuilder) { var accessors = new List <OePropertyAccessor>(); ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression instance = Expression.Convert(parameter, OeExpressionHelper.GetCollectionItemType(source.Type)); while (orderByClause != null) { MemberExpression propertyExpression = Translators.OeOrderByTranslator.GetPropertyExpression(joinBuilder, source, instance, orderByClause.Expression); IEdmStructuralProperty edmProperty = GetEdmProperty(orderByClause.Expression, propertyExpression.Type); OePropertyAccessor accessor; if (typeof(OeDynamicType).IsAssignableFrom(propertyExpression.Expression !.Type)) { PropertyInfo indexProperty = typeof(OeDynamicType).GetProperty("Item") !; MethodCallExpression expression = Expression.Call(propertyExpression.Expression !, indexProperty.GetGetMethod() !, Expression.Constant(edmProperty.Name)); accessor = OePropertyAccessor.CreatePropertyAccessor(edmProperty, expression, parameter, true); }
private OePropertyAccessor[] GetSkipTokenAccessors(IEdmModel edmModel, OrderByClause?orderByClause) { ParameterExpression parameter = Expression.Parameter(typeof(Object)); Type clrEntityType = edmModel.GetClrType(EntitySet); var visitor = new OeQueryNodeVisitor(Expression.Parameter(clrEntityType)); var skipTokenAccessors = new List <OePropertyAccessor>(); while (orderByClause != null) { var propertyNode = (SingleValuePropertyAccessNode)orderByClause.Expression; var propertyExpression = (MemberExpression)visitor.Visit(propertyNode); propertyExpression = OeExpressionHelper.ReplaceParameter(propertyExpression, parameter); skipTokenAccessors.Add(OePropertyAccessor.CreatePropertyAccessor(propertyNode.Property, propertyExpression, parameter, true)); orderByClause = orderByClause.ThenBy; } return(skipTokenAccessors.ToArray()); }
protected OePropertyAccessor[] GetAccessorsFromTuple(IEdmModel edmModel) { 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; } } return(accessors); }
private OeEntryFactory CreateEntryFactoryFromTuple(OeEntryFactory parentEntryFactory) { OePropertyAccessor[] accessors = _allAccessors; if (IsTuple) { accessors = new OePropertyAccessor[_allAccessors.Length]; OePropertyAccessor[] propertyAccessors = OePropertyAccessor.CreateFromType(ClrEntityType, EntitySet); 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(this); } if (parentEntryFactory == null) { return(OeEntryFactory.CreateEntryFactoryParent(ClrEntityType, EntitySet, accessors, navigationLinks, null)); } ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression typedParameter = Expression.Convert(parameter, parentEntryFactory.ClrEntityType); MemberExpression navigationPropertyExpression = Expression.Property(typedParameter, ResourceInfo.Name); LambdaExpression linkAccessor = Expression.Lambda(navigationPropertyExpression, parameter); return(OeEntryFactory.CreateEntryFactoryNested(ClrEntityType, EntitySet, accessors, navigationLinks, linkAccessor, ResourceInfo)); }
public static OePropertyAccessor[] GetAccessors(Expression source, OrderByClause orderByClause) { var accessors = new List <OePropertyAccessor>(); var tupleProperty = new OePropertyTranslator(source); Type itemType = OeExpressionHelper.GetCollectionItemType(source.Type); ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression instance = Expression.Convert(parameter, itemType); while (orderByClause != null) { var propertyNode = (SingleValuePropertyAccessNode)orderByClause.Expression; MemberExpression propertyExpression = tupleProperty.Build(instance, propertyNode.Property); if (propertyExpression == null) { throw new InvalidOperationException("order by property " + propertyNode.Property.Name + "not found"); } accessors.Add(OePropertyAccessor.CreatePropertyAccessor(propertyNode.Property, propertyExpression, parameter)); orderByClause = orderByClause.ThenBy; } return(accessors.ToArray()); }