SqlAggregateChecker.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using System.Data.Linq;
  5. namespace System.Data.Linq.SqlClient {
  6. internal class SqlAggregateChecker {
  7. Visitor visitor;
  8. internal SqlAggregateChecker() {
  9. this.visitor = new Visitor();
  10. }
  11. internal bool HasAggregates(SqlNode node) {
  12. visitor.hasAggregates = false;
  13. visitor.Visit(node);
  14. return visitor.hasAggregates;
  15. }
  16. class Visitor : SqlVisitor {
  17. internal bool hasAggregates;
  18. internal Visitor() {
  19. }
  20. internal override SqlExpression VisitSubSelect(SqlSubSelect ss) {
  21. return ss;
  22. }
  23. internal override SqlSource VisitSource(SqlSource source) {
  24. return source;
  25. }
  26. internal override SqlExpression VisitUnaryOperator(SqlUnary uo) {
  27. switch (uo.NodeType) {
  28. case SqlNodeType.Min:
  29. case SqlNodeType.Max:
  30. case SqlNodeType.Avg:
  31. case SqlNodeType.Sum:
  32. case SqlNodeType.Count:
  33. case SqlNodeType.LongCount:
  34. this.hasAggregates = true;
  35. return uo;
  36. default:
  37. return base.VisitUnaryOperator(uo);
  38. }
  39. }
  40. }
  41. }
  42. }