public void SelectCount(Expression condition) { SelectNode = new CountSelectNode(this); if (condition != null) { WhereNodes.Add(new WhereNode(condition.GetLambda(), FromNode.Alias, this)); } }
public void SelectSingle(Expression condition, bool allowDefault) { AllowDefault = allowDefault; Take = new ConstantNode(Expression.Constant(1), this); if (condition != null) { WhereNodes.Add(new WhereNode(condition.GetLambda(), FromNode.Alias, this)); } }
private void DoVisit(MethodCallExpression expression) { switch (expression.Method.Name) { case "Where": WhereNodes.Add(new WhereNode(expression.Arguments[1].GetLambda(), FromNode.Alias, this)); Visit(expression.Arguments[0]); break; case "OrderBy": case "OrderByDescending": case "ThenBy": case "ThenByDescending": Visit(expression.Arguments[0]); break; default: throw new InvalidOperationException(string.Format("Method {0} is not valid for {1}", expression.Method.GetFriendlyName(), GetType().GetFriendlyName())); } }
public void Where(LambdaExpression lambda) { WhereNodes.Add(new WhereNode(lambda, FromNode.Alias, this)); }
private void DoVisit(MethodCallExpression expression) { switch (expression.Method.Name) { case "Where": _actions.Push(() => WhereNodes.Add(new WhereNode(expression.Arguments[1].GetLambda(), FromNode.Alias, this))); Visit(expression.Arguments[0]); break; case "OrderBy": case "ThenBy": _actions.Push(() => OrderBy(expression.Arguments[1], SortDir.Asc)); Visit(expression.Arguments[0]); break; case "OrderByDescending": case "ThenByDescending": _actions.Push(() => OrderBy(expression.Arguments[1], SortDir.Desc)); Visit(expression.Arguments[0]); break; case "First": case "Single": _actions.Push(() => SelectSingle(expression.GetArgumentOrDefault(1), false)); Visit(expression.Arguments[0]); break; case "FirstOrDefault": case "SingleOrDefault": _actions.Push(() => SelectSingle(expression.GetArgumentOrDefault(1), true)); Visit(expression.Arguments[0]); break; case "Count": _actions.Push(() => SelectCount(expression.GetArgumentOrDefault(1))); Visit(expression.Arguments[0]); break; case "Select": Select(expression); break; case "Sum": _actions.Push(() => SelectNode = new SumSelectNode(expression.Arguments[1].GetLambda(), this)); Visit(expression.Arguments[0]); break; case "Skip": _actions.Push(() => Skip = For(expression.Arguments[1])); Visit(expression.Arguments[0]); break; case "Distinct": _actions.Push(() => Distinct = true); Visit(expression.Arguments[0]); break; case "Take": _actions.Push(() => Take = For(expression.Arguments[1])); Visit(expression.Arguments[0]); break; default: throw new InvalidOperationException(string.Format("Don't know how to parse method {0}", expression.Method.GetFriendlyName())); } }