Example #1
0
        protected override void VisitFilter(IFragmentBuilder parent, IQueryGraphBuilder graph, IFilterBuilder expression)
        {
            if (!expression.Offset.HasValue)
            {
                return;
            }
            var offset = expression.Offset.Value + 1;

            expression.Add().With(filter =>
            {
                filter.Left = filter.CreateIdentifier(
                    string.Format(
                        "{0}_RowNumber",
                        expression.Id
                        )
                    );
                if (expression.Limit.HasValue)
                {
                    var limit       = expression.Limit.Value - 1;
                    filter.Operator = filter.CreateOperator(QueryOperator.Between);
                    filter.Right    = filter.CreateBinary(
                        filter.CreateConstant(offset),
                        filter.CreateOperator(QueryOperator.AndAlso),
                        filter.CreateConstant(offset + limit)
                        );
                }
                else
                {
                    filter.Operator = filter.CreateOperator(QueryOperator.GreaterOrEqual);
                    filter.Right    = filter.CreateConstant(offset);
                }
            });
        }