public override IQueryable <T> VisitReduce(RiqlParser.ReduceContext context) { var previous = base.VisitReduce(context); var parameter = Expression.Parameter(typeof(T), "i"); var inits = context.property() .Select(a => this._propertyAccessor.ParsePath(parameter, a.GetText())) .Select(v => (MemberExpression)v.Expression) .Select(m => Expression.Bind(m.Member, m)); var create = Expression.New(typeof(T)); var init = Expression.MemberInit(create, inits); var reducer = Expression.Lambda <Func <T, T> >(init, parameter); this._current = previous.Select(reducer); return(this._current); }
/// <summary> /// Visit a parse tree produced by <see cref="RiqlParser.reduce"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitReduce([NotNull] RiqlParser.ReduceContext context) { return(VisitChildren(context)); }