private static OeEntryFactory CreateEntryFactory(IEdmModel edmModel, OeSelectItem root, Type clrType) { ParameterExpression parameter = Expression.Parameter(typeof(Object)); UnaryExpression typedParameter = Expression.Convert(parameter, clrType); if (root.HasNavigationItems) { List <OeSelectItem> navigationItems = FlattenNavigationItems(root, false); IReadOnlyList <MemberExpression> navigationProperties = OeExpressionHelper.GetPropertyExpressions(typedParameter); for (int i = navigationItems.Count - 1; i >= 0; i--) { OeSelectItem navigationItem = navigationItems[i]; OeEntryFactory[] nestedNavigationLinks = GetNestedNavigationLinks(navigationItem); OeEntryFactory entryFactory; Type clrEntityType = edmModel.GetClrType(navigationItem.EntitySet); OePropertyAccessor[] accessors = GetAccessors(navigationProperties[i].Type, navigationItem.EntitySet, navigationItem.SelectItems); LambdaExpression linkAccessor = Expression.Lambda(navigationProperties[i], parameter); if (i == 0) { entryFactory = OeEntryFactory.CreateEntryFactoryParent(clrEntityType, navigationItem.EntitySet, accessors, nestedNavigationLinks, linkAccessor); } else { var resourceInfo = new ODataNestedResourceInfo() { IsCollection = navigationItem.EdmProperty.Type.Definition is EdmCollectionType, Name = navigationItem.EdmProperty.Name }; entryFactory = OeEntryFactory.CreateEntryFactoryNested(clrEntityType, navigationItem.EntitySet, accessors, nestedNavigationLinks, linkAccessor, resourceInfo); entryFactory.CountOption = navigationItem.ExpandedNavigationSelectItem.CountOption; } navigationItem.EntryFactory = entryFactory; } } else { IReadOnlyList <MemberExpression> propertyExpressions = OeExpressionHelper.GetPropertyExpressions(typedParameter); OePropertyAccessor[] accessors; if (root.SelectItems.Count == 0) { accessors = OePropertyAccessor.CreateFromType(typedParameter.Type, root.EntitySet); } else { var accessorList = new List <OePropertyAccessor>(root.SelectItems.Count); for (int i = 0; i < root.SelectItems.Count; i++) { OeSelectItem selectItem = root.SelectItems[i]; accessorList.Add(OePropertyAccessor.CreatePropertyAccessor(selectItem.EdmProperty, propertyExpressions[i], parameter, selectItem.SkipToken)); } accessors = accessorList.ToArray(); } Type clrEntityType = edmModel.GetClrType(root.EntitySet); root.EntryFactory = OeEntryFactory.CreateEntryFactory(clrEntityType, root.EntitySet, accessors); } return(root.EntryFactory); }
public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel, Type returnClrType) { String entitySetName = _dataAdapter.EntitySetMetaAdapters.FindByClrType(returnClrType).EntitySetName; IEdmEntitySet entitySet = _model.FindDeclaredEntitySet(entitySetName); OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(returnClrType, entitySet); Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.GetEntitySetAdapter(entitySet.Name); return(new OeQueryContext(_model, odataUri, entitySet, null, false, 0, false, _dataAdapter.IsDatabaseNullHighestValue, metadataLevel, ref entitySetAdapter) { EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors), }); }
public OeEntryFactory CreateEntryFactory(IEdmEntitySet entitySet, Type clrType) { OePropertyAccessor[] accessors; if (_aggProperties.Count == 0) { accessors = OePropertyAccessor.CreateFromType(clrType, entitySet); } else { int groupIndex = _aggProperties.FindIndex(a => a.IsGroup); accessors = OePropertyAccessor.CreateFromTuple(clrType, _aggProperties, groupIndex); } return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); }
private static OeEntryFactory CreateEntryFactory(IEdmModel edmModel, Expression source, Type entityType, List <AggProperty> _aggProperties) { IEdmEntitySet entitySet = OeEdmClrHelper.GetEntitySet(edmModel, entityType); OePropertyAccessor[] accessors; if (_aggProperties.Count == 0) { accessors = OePropertyAccessor.CreateFromType(entityType, entitySet); } else { Type sourceItemType = OeExpressionHelper.GetCollectionItemType(source.Type); int groupIndex = _aggProperties.FindIndex(a => a.IsGroup); accessors = OePropertyAccessor.CreateFromTuple(sourceItemType, _aggProperties, groupIndex); } return(OeEntryFactory.CreateEntryFactory(entitySet, accessors)); }