private void BuildOrderBy(OrderByClause orderByClause) { bool propertySelect = false; if (_selectItemInfos.Count == 0) { if (OeExpressionHelper.IsTupleType(_visitor.Parameter.Type)) { return; } _selectItemInfos.Add(new SelectItemInfo(_visitor.Parameter)); } else { propertySelect = _selectItemInfos.Any(i => i.PropertySelect); } while (orderByClause != null) { var propertyNode = (SingleValuePropertyAccessNode)orderByClause.Expression; orderByClause = orderByClause.ThenBy; if (SelectItemInfoExists(propertyNode.Property)) { continue; } if (!propertySelect && propertyNode.Source is ResourceRangeVariableReferenceNode) { continue; } _selectItemInfos.Add(new SelectItemInfo(_visitor.Visit(propertyNode))); } }
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()); }