public static void LoadWhereHandler([NotNull] Type type, [NotNull] WhereHandlerAttribute whereHandlerAttribute) { Assert.ArgumentNotNull(type, nameof(type)); Assert.ArgumentNotNull(whereHandlerAttribute, nameof(whereHandlerAttribute)); var where = new WhereHandler { Type = type, Attribute = whereHandlerAttribute }; whereHandlers.Add(where); }
protected override Expression VisitMethodCall(MethodCallExpression m) { if (m.Method.DeclaringType == typeof(Queryable)) { switch (m.Method.Name) { case "Select": Debug.Assert(selectHandler == null); selectHandler = SelectHandler.GetSelectHandler(indentLevel + 1, m, aggregateType); if (selectHandler == null) { this.queryableMethods.Enqueue(m); } this.Visit(m.Arguments[0]); break; case "Join": Debug.Assert(joinHandler == null); Debug.Assert(crossJoinHandler == null); joinHandler = JoinHandler.GetJoinHandler(this, indentLevel + 1, m); break; case "SelectMany": Debug.Assert(crossJoinHandler == null); Debug.Assert(joinHandler == null); crossJoinHandler = CrossJoinHandler.GetCrossJoinHandler(this, indentLevel + 1, m); break; case "Where": Debug.Assert(whereHandler == null); int parameterBaseIndex = outerStatement == null ? 0 : outerStatement.ParameterCount; whereHandler = WhereHandler.GetWhereHandler(indentLevel + 1, m, parameterBaseIndex); if (whereHandler == null) { this.queryableMethods.Enqueue(m); } this.Visit(m.Arguments[0]); break; case "OrderBy": case "OrderByDescending": case "ThenBy": case "ThenByDescending": var orderByHandler = OrderByHandler.GetOrderByHandler(indentLevel + 1, m); if (orderByHandler == null) { this.queryableMethods.Enqueue(m); } else { orderByHandlers.Push(orderByHandler); } this.Visit(m.Arguments[0]); break; default: queryableMethods.Enqueue(m); this.Visit(m.Arguments[0]); break; } } else { throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name)); } return m; }