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 List <OeEntryFactory> GetNavigationLinks(IReadOnlyList <MemberExpression> itemExpressions, ParameterExpression parameter) { var navigationLinks = new List <OeEntryFactory>(_selectItemInfos.Count); for (int i = 0; i < _selectItemInfos.Count; i++) { SelectItemInfo itemInfo = _selectItemInfos[i]; if (itemInfo.EdmProperty is IEdmNavigationProperty) { MemberExpression expression = itemExpressions[_pathSelect ? i : i + 1]; OeEntryFactory entryFactory; if (itemInfo.EntryFactory == null) { Type type = expression.Type; if (itemInfo.ResourceInfo.IsCollection.GetValueOrDefault()) { type = OeExpressionHelper.GetCollectionItemType(type); } OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(type, itemInfo.EntitySet); entryFactory = OeEntryFactory.CreateEntryFactoryChild(itemInfo.EntitySet, accessors, itemInfo.ResourceInfo); entryFactory.CountOption = itemInfo.CountOption; } else { entryFactory = itemInfo.EntryFactory; } entryFactory.LinkAccessor = (Func <Object, Object>)Expression.Lambda(expression, parameter).Compile(); navigationLinks.Add(entryFactory); } } return(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 OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet) { if (_entryFactoryFactory != null) { return(_entryFactoryFactory(entitySet, ParameterType)); } OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(ParameterType, entitySet); return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); }
public OeQueryContext CreateQueryContext(ODataUri odataUri, IEdmEntitySet entitySet, OeMetadataLevel metadataLevel) { OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet); Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet); return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter) { EntryFactory = new OeEntryFactory(entitySet, accessors, null), MetadataLevel = metadataLevel }); }
public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySet entitySet, Type sourceType) { OePropertyAccessor[] accessors; if (_aggProperties.Count == 0) { accessors = OePropertyAccessor.CreateFromType(entityType, entitySet); } else { accessors = OePropertyAccessor.CreateFromTuple(sourceType, _aggProperties, 0); } return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); }
public OeEntryFactory CreateEntryFactory(Type entityType, IEdmEntitySet entitySet, Type sourceType) { OePropertyAccessor[] accessors; if (_aggProperties.Count == 0) { accessors = OePropertyAccessor.CreateFromType(entityType, entitySet); } else { int groupIndex = _aggProperties.FindIndex(a => a.IsGroup); accessors = OePropertyAccessor.CreateFromTuple(sourceType, _aggProperties, groupIndex); } return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); }
public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel) { var importSegment = (OperationImportSegment)odataUri.Path.FirstSegment; IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single()); if (entitySet == null) return null; Type clrType = _edmModel.GetClrType(entitySet.EntityType()); OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrType, entitySet); Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet); return new OeQueryContext(_edmModel, odataUri, null, false, 0, false, metadataLevel, entitySetAdapter) { EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors), }; }
public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel) { var importSegment = (OperationImportSegment)odataUri.Path.FirstSegment; IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single()); if (entitySet == null) { return(null); } OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet); Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet); return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter) { EntryFactory = new OeEntryFactory(entitySet, accessors, Array.Empty <OePropertyAccessor>()), MetadataLevel = metadataLevel }); }
private OeEntryFactory CreateEntryFactory(OeExpressionBuilder expressionBuilder) { IEdmEntitySet entitySet; if (ODataUri.Path.LastSegment is OperationSegment) { entitySet = OeOperationHelper.GetEntitySet(ODataUri.Path); Type clrEntityType = EdmModel.GetClrType(entitySet.EntityType()); OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrEntityType, entitySet); return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); } entitySet = OeParseNavigationSegment.GetEntitySet(ParseNavigationSegments); if (entitySet == null) { entitySet = OeEdmClrHelper.GetEntitySet(EdmModel, EntitySetAdapter.EntitySetName); } return(expressionBuilder.CreateEntryFactory(entitySet)); }
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)); }