protected override Expression VisitMethodCall(MethodCallExpression m) { if (m.Method.Name == "Where") { _sql.Append(" WHERE "); SheetType = m.Type.GetGenericArguments()[0]; ReturnType = SheetType; this.Visit(m.Arguments[1]); } else if (IsRowMethodCall(m)) { if (m.Object.As<MethodCallExpression>().Arguments[0].As<ConstantExpression>().Type == typeof(int)) throw new ArgumentException("Cannot use column indexes in where clause"); string columnName = m.Object.As<MethodCallExpression>().Arguments[0].As<ConstantExpression>().Value.ToString(); _sql.Append(string.Format("[{0}]", columnName)); } else if (m.Method.Name == "Select") { SheetType = m.Method.GetGenericArguments()[0]; ReturnType = m.Method.GetGenericArguments()[1]; if (m.Arguments[0].NodeType != ExpressionType.Constant) this.Visit(m.Arguments[0]); //Where clause NewExp = m.Arguments[1].As<UnaryExpression>().Operand; } else { object methodObject = ((ConstantExpression)m.Object).Value; object returnValue = m.Invoke(); _params.Add(new OleDbParameter("?", returnValue)); _sql.Append("?"); } return m; }