private Expression GetInnerSource(OeSelectItem navigationItem, ExpandedNavigationSelectItem item) { Type clrEntityType = _visitor.EdmModel.GetClrType(navigationItem.EdmProperty.DeclaringType); PropertyInfo navigationClrProperty = OeEdmClrHelper.GetPropertyIgnoreCase(clrEntityType, navigationItem.EdmProperty); Type itemType = OeExpressionHelper.GetCollectionItemType(navigationClrProperty.PropertyType); if (itemType == null) { itemType = navigationClrProperty.PropertyType; } var visitor = new OeQueryNodeVisitor(_visitor, Expression.Parameter(itemType)); var expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor); Expression innerSource = Expression.Constant(null, typeof(IEnumerable <>).MakeGenericType(itemType)); innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption); if (item.SkipOption != null || item.TopOption != null) { Expression source = Expression.Constant(null, typeof(IEnumerable <>).MakeGenericType(navigationClrProperty.DeclaringType)); innerSource = OeCrossApplyBuilder.Build(source, innerSource, item, navigationItem.Path, expressionBuilder); } return(innerSource); }
private Expression GetInnerSource(OeSelectItem navigationItem, ExpandedNavigationSelectItem item) { Type clrEntityType = _visitor.EdmModel.GetClrType(navigationItem.EdmProperty.DeclaringType); PropertyInfo navigationClrProperty = clrEntityType.GetPropertyIgnoreCase(navigationItem.EdmProperty); Type itemType = OeExpressionHelper.GetCollectionItemType(navigationClrProperty.PropertyType); if (itemType == null) { itemType = navigationClrProperty.PropertyType; } var visitor = new OeQueryNodeVisitor(_visitor, Expression.Parameter(itemType)); var expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor); var navigationEdmProperty = (IEdmNavigationProperty)navigationItem.EdmProperty; if (navigationEdmProperty.ContainsTarget) { ModelBuilder.ManyToManyJoinDescription joinDescription = _visitor.EdmModel.GetManyToManyJoinDescription(navigationEdmProperty); navigationEdmProperty = joinDescription.TargetNavigationProperty; } IEdmEntitySet innerEntitySet = OeEdmClrHelper.GetEntitySet(_visitor.EdmModel, navigationEdmProperty); Expression innerSource = OeEnumerableStub.CreateEnumerableStubExpression(itemType, innerEntitySet); innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption); if (item.SkipOption != null || item.TopOption != null) { Expression source = OeEnumerableStub.CreateEnumerableStubExpression(navigationClrProperty.DeclaringType, (IEdmEntitySet)_navigationItem.EntitySet); innerSource = OeCrossApplyBuilder.Build(source, innerSource, item, navigationItem.Path, expressionBuilder); } return(innerSource); }
internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem) { _joinBuilder = joinBuilder; _navigationItem = navigationItem; _visitor = joinBuilder.Visitor; _metadataLevel = OeMetadataLevel.None; }
public OeSelectItemTranslator(OeSelectItem navigationItem, bool navigationNextLink, Expression source, OeJoinBuilder joinBuilder, bool skipToken) { _navigationItem = navigationItem; _navigationNextLink = navigationNextLink; _source = source; _joinBuilder = joinBuilder; _skipToken = skipToken; _visitor = joinBuilder.Visitor; }
private Expression GetInnerSource(OeNavigationSelectItem navigationItem) { if (navigationItem.Parent == null) { throw new InvalidOperationException("Inner source cannot exist for root item"); } Type clrEntityType = _edmModel.GetClrType(navigationItem.EdmProperty.DeclaringType); PropertyInfo navigationClrProperty = clrEntityType.GetPropertyIgnoreCase(navigationItem.EdmProperty); Type itemType = OeExpressionHelper.GetCollectionItemTypeOrNull(navigationClrProperty.PropertyType) ?? navigationClrProperty.PropertyType; var visitor = new OeQueryNodeVisitor(_joinBuilder.Visitor, Expression.Parameter(itemType)); var expressionBuilder = new OeExpressionBuilder(_joinBuilder, visitor); IEdmNavigationProperty navigationProperty = navigationItem.EdmProperty; if (navigationItem.EdmProperty.ContainsTarget) { ModelBuilder.ManyToManyJoinDescription joinDescription = _edmModel.GetManyToManyJoinDescription(navigationProperty); navigationProperty = joinDescription.TargetNavigationProperty; } IEdmEntitySet innerEntitySet = OeEdmClrHelper.GetEntitySet(_edmModel, navigationProperty); Expression innerSource = OeEnumerableStub.CreateEnumerableStubExpression(itemType, innerEntitySet); ExpandedNavigationSelectItem item = navigationItem.NavigationSelectItem; innerSource = expressionBuilder.ApplyFilter(innerSource, item.FilterOption); long?top = GetTop(navigationItem, item.TopOption); if (top == null && item.SkipOption == null) { return(innerSource); } OrderByClause orderByClause = item.OrderByOption; if (navigationItem.PageSize > 0) { orderByClause = OeSkipTokenParser.GetUniqueOrderBy(navigationItem.EntitySet, item.OrderByOption, null); } var entitySet = (IEdmEntitySet)navigationItem.Parent.EntitySet; Expression source = OeEnumerableStub.CreateEnumerableStubExpression(navigationClrProperty.DeclaringType, entitySet); var crossApplyBuilder = new OeCrossApplyBuilder(_edmModel, expressionBuilder); return(crossApplyBuilder.Build(source, innerSource, navigationItem.Path, orderByClause, item.SkipOption, top)); }
private IEnumerable <KeyValuePair <String, Object> > GetKeys(T entity) { var visitor = new OeQueryNodeVisitor(_edmModel, Expression.Parameter(typeof(T))); OrderByClause orderByClause = _odataUri.OrderBy; do { var propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression); UnaryExpression body = Expression.Convert(propertyExpression, typeof(Object)); Expression <Func <T, Object> > getValueLambda = Expression.Lambda <Func <T, Object> >(body, visitor.Parameter); Object value = getValueLambda.Compile()(entity); yield return(new KeyValuePair <String, Object>(OeSkipTokenParser.GetPropertyName(propertyExpression), value)); orderByClause = orderByClause.ThenBy; }while (orderByClause != null); }
private static void SetOrderByProperties(OeQueryContext queryContext, Object entity, Object value) { var visitor = new OeQueryNodeVisitor(queryContext.EdmModel, Expression.Parameter(typeof(T))); var setPropertyValueVisitor = new SetPropertyValueVisitor(); int i = 0; OrderByClause orderByClause = queryContext.ODataUri.OrderBy; while (orderByClause != null) { var propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression); Object orderValue = queryContext.SkipTokenAccessors[i++].GetValue(value); setPropertyValueVisitor.SetPropertyValue(entity, propertyExpression, orderValue); orderByClause = orderByClause.ThenBy; } }
private void SetOrderByProperties(Object entity, Object value) { var visitor = new OeQueryNodeVisitor(_skipTokenParser.EdmModel, Expression.Parameter(typeof(T))); var setPropertyValueVisitor = new SetPropertyValueVisitor(); int i = 0; OrderByClause orderByClause = _skipTokenParser.UniqueOrderBy; while (orderByClause != null) { var propertyExpression = (MemberExpression)visitor.TranslateNode(orderByClause.Expression); Object orderValue = _skipTokenParser.Accessors[i++].Accessor(value); setPropertyValueVisitor.SetPropertyValue(entity, propertyExpression, orderValue); orderByClause = orderByClause.ThenBy; } }
private MethodCallExpression ApplyCompute(Expression source, ComputeTransformationNode transformation) { var expressions = new List <Expression>(); Type sourceType = OeExpressionHelper.GetCollectionItemType(source.Type); ParameterExpression sourceParameter = Expression.Parameter(sourceType); if (_aggProperties.Count > 0) { var callExpression = (MethodCallExpression)source; source = callExpression.Arguments[0]; var aggLambda = (LambdaExpression)callExpression.Arguments[1]; expressions.AddRange(((NewExpression)aggLambda.Body).Arguments); sourceType = OeExpressionHelper.GetCollectionItemType(source.Type); sourceParameter = aggLambda.Parameters[0]; } OeQueryNodeVisitor visitor = CreateVisitor(sourceParameter); if (_aggProperties.Count > 0) { visitor.TuplePropertyByAliasName = new ComputeAliasNameResolver(_aggProperties, expressions).GetTuplePropertyByAliasName; } foreach (ComputeExpression computeExpression in transformation.Expressions) { Expression expression = visitor.TranslateNode(computeExpression.Expression); expressions.Add(expression); _aggProperties.Add(CreateEdmProperty(visitor.EdmModel, expression.Type, computeExpression.Alias, false)); } NewExpression newExpression = OeExpressionHelper.CreateTupleExpression(expressions); MethodInfo selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(sourceParameter.Type, newExpression.Type); LambdaExpression lambda = Expression.Lambda(newExpression, sourceParameter); return(Expression.Call(selectMethodInfo, source, lambda)); }
public OeJoinBuilder(OeQueryNodeVisitor visitor) { Visitor = visitor; _joinPaths = new List <IEdmNavigationProperty[]>(); }
public OeAggregationTranslator(OeQueryNodeVisitor visitor) { _visitor = visitor; _aggProperties = new List <AggProperty>(); }
public OeSkipTokenTranslator(OeQueryNodeVisitor visitor, OeJoinBuilder joinBuilder, bool isDatabaseNullHighestValue) { _visitor = visitor; _joinBuilder = joinBuilder; _isDatabaseNullHighestValue = isDatabaseNullHighestValue; }
internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem) { _joinBuilder = joinBuilder; _navigationItem = navigationItem; _visitor = joinBuilder.Visitor; }
public DollarItVisitor(OeQueryNodeVisitor parentVisitor, ParameterExpression parameter, IEdmModel edmModel) : base(parentVisitor, parameter) { _edmModel = edmModel; }