public static CommandBuilderState AsCommandBuilder(CommandBuilderState state)
        {
            // time to build the CommandText

            var StrategyDescriptor = state.Strategy.GetDescriptor();



            // X:\jsc.svn\examples\javascript\forms\Test\TestSQLJoin\TestSQLJoin\ApplicationWebService.cs
            if (StrategyDescriptor != null)
            {
                // http://www.linkedin.com/groups/select-vs-selecting-all-columns-66097.S.206400776
                state.SelectCommand = StrategyDescriptor.GetSelectAllColumnsText();

                state.FromCommand = "from `" + StrategyDescriptor.GetQualifiedTableName() + "`";
            }

            foreach (var item in state.Strategy.GetCommandBuilder())
            {
                item(state);
            }

            return(state);
        }
        // upper select needs us to proxy some fields
        public static void WriteExpressionAlias(
            this CommandBuilderState state,
            // either WhereCommand or SelectCommand
            // byref against locals will likely work better than fields
            ref string s,
            Expression asExpression,

            IQueryStrategy that
            )
        {
            // asExpression = {nt => new <>f__AnonymousType5`1(AccountToID = nt.Last().t.OtherPartyIBAN)}
            // asExpression = {nt => nt.Last().t.OtherPartyIBAN}
            // asExpression = {nt => 2}

            #region LambdaExpression - upper selector
            var xLambdaExpression = asExpression as LambdaExpression;
            if (xLambdaExpression != null)
            {
                // look the join needs to proxy fields and the upper select isnt selecting scalar..

                // um. we do need to flatten it.

                //var xasNewExpression = xasLambdaExpression.Body as NewExpression;
                //


                WriteExpressionAlias(
                    state,
                    ref s,
                    xLambdaExpression.Body,
                    that
                    );

                return;
            }
            #endregion

            #region xConstantExpression
            var xConstantExpression = asExpression as ConstantExpression;
            if (xConstantExpression != null)
            {
                // lets not try to proxy the constant.
                // the upper select will render it itself
                return;
            }
            #endregion

            // +		asExpression	{nt.Last().t.OtherPartyIBAN}	System.Linq.Expressions.Expression {System.Linq.Expressions.FieldExpression}
            var xMemberExpression = asExpression as MemberExpression;
            if (xMemberExpression != null)
            {
                // scalar field selection?

                s += "\n" + QueryStrategyOfTRowExtensions.CommentLineNumber() + "\t"
                     // shall we look at 'that' and try to understand whats the name of the member?
                     + xMemberExpression.Member.Name + " as " + xMemberExpression.Member.Name;



                return;
            }

            Debugger.Break();
        }
        public static CommandBuilderState AsCommandBuilder(CommandBuilderState state)
        {
            // time to build the CommandText

            var StrategyDescriptor = state.Strategy.GetDescriptor();



            // X:\jsc.svn\examples\javascript\forms\Test\TestSQLJoin\TestSQLJoin\ApplicationWebService.cs
            if (StrategyDescriptor != null)
            {
                // http://www.linkedin.com/groups/select-vs-selecting-all-columns-66097.S.206400776
                state.SelectCommand = StrategyDescriptor.GetSelectAllColumnsText();

                state.FromCommand = "from `" + StrategyDescriptor.GetQualifiedTableName() + "`";
            }

            foreach (var item in state.Strategy.GetCommandBuilder())
            {
                item(state);
            }

            return state;
        }
        // are the extension methods the new instance methods?
        // shall we  start by string::IsNullOrEmpty ?
        // X:\jsc.svn\examples\javascript\LINQ\test\TestSelectDatesThenCountSimilars\TestSelectDatesThenCountSimilars\ApplicationWebService.cs
        public static void WriteExpression(
            this CommandBuilderState state,
            // either WhereCommand or SelectCommand
            // byref against locals will likely work better than fields
            ref string s,
            Expression asExpression,

            IQueryStrategy that
            )
        {
            // X:\jsc.svn\examples\javascript\linq\test\TestWhereIsNullOrEmpty\TestWhereIsNullOrEmpty\ApplicationWebService.cs
            // X:\jsc.svn\core\ScriptCoreLib.Extensions\ScriptCoreLib.Extensions\Query\QueryStrategyOfTRowExtensions.Where.cs

            // where not(`path` is null or length(`path`) = 0)
            // asExpression = {Not(IsNullOrEmpty(x.path))}

            #region asBinaryExpression
            var asBinaryExpression = asExpression as BinaryExpression;
            if (asBinaryExpression != null)
            {
                s += "(";
                state.WriteExpression(ref s, asBinaryExpression.Left, that);


                #region ExpressionType
                if (asBinaryExpression.NodeType == ExpressionType.Equal)
                {
                    s += "=";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.LessThan)
                {
                    s += "<";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.LessThanOrEqual)
                {
                    s += "<=";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.GreaterThan)
                {
                    s += ">";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.GreaterThanOrEqual)
                {
                    s += ">=";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.NotEqual)
                {
                    s += "<>";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.OrElse)
                {
                    s += " or ";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.AndAlso)
                {
                    s += " and ";
                }

                // X:\jsc.svn\examples\javascript\linq\test\TestWhereMathAdd\TestWhereMathAdd\ApplicationWebService.cs
                else if (asBinaryExpression.NodeType == ExpressionType.Add)
                {
                    s += " + ";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.Subtract)
                {
                    s += " - ";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.Multiply)
                {
                    s += " * ";
                }
                else if (asBinaryExpression.NodeType == ExpressionType.Divide)
                {
                    s += " / ";
                }

                else
                {
                    Debugger.Break();
                }
                #endregion

                state.WriteExpression(ref s, asBinaryExpression.Right, that);
                s += ")";
                return;
            }
            #endregion


            #region asConstantExpression
            var asConstantExpression = asExpression as ConstantExpression;
            if (asConstantExpression != null)
            {
                var __value = asConstantExpression.Value;

                WriteExpressionConstantCounter++;
                var n = "@arg" + WriteExpressionConstantCounter;
                s += n;

                state.ApplyParameter.Add(c => c.AddParameter(n, __value));
                return;
            }
            #endregion


            #region WriteExpression:asMemberExpression
            var asMemberExpression = asExpression as MemberExpression;
            if (asMemberExpression != null)
            {
                // arg1 = {value(TestWhereContains.ApplicationWebService+<>c__DisplayClass0).z.u.n}
                // are we supposed to find that constant?

                #region GetValue
                var GetValue = default(Func <object>);

                #region xConstantExpression
                Action <MemberExpression, Action <object> > yy = null;

                yy = (x, yield) =>
                {
                    #region atyield
                    Action <object> atyield =
                        __value =>
                    {
                        var xPropertyInfo = x.Member as PropertyInfo;
                        if (xPropertyInfo != null)
                        {
                            yield(
                                xPropertyInfo.GetValue(__value, null)
                                );
                            return;
                        }


                        var xFieldInfo = x.Member as FieldInfo;
                        if (xFieldInfo != null)
                        {
                            yield(
                                xFieldInfo.GetValue(__value)
                                );
                            // __value2 = { u = { n = C } }
                            return;
                        }
                    };
                    #endregion


                    var xConstantExpression = x.Expression as ConstantExpression;
                    if (xConstantExpression != null)
                    {
                        // z = { u = { n = C } }
                        atyield(xConstantExpression.Value);
                    }


                    if (x.Expression is MemberExpression)
                    {
                        yy(x.Expression as MemberExpression, atyield);
                    }
                };
                #endregion

                yy(asMemberExpression,
                   __value =>
                {
                    GetValue = () => __value;
                }
                   );

                if (GetValue != null)
                {
                    var __value = GetValue();

                    WriteExpressionConstantCounter++;
                    var n = "@arg" + WriteExpressionConstantCounter;
                    s += n;

                    state.ApplyParameter.Add(c => c.AddParameter(n, __value));
                    return;
                }
                #endregion


                // are we looking at a group?
                // asMemberExpression = {gg.Key.domComplete}


                // where (`domComplete`=(`domComplete` - @arg3))


                var currentSelect = (that as QueryStrategyOfTRowExtensions.INestedQueryStrategy).upperSelect;
                if (currentSelect != null)
                {
                    var currentGroup = (that as QueryStrategyOfTRowExtensions.INestedQueryStrategy).upperSelect.upperGroupBy;
                    if (currentGroup != null)
                    {
                        // keySelector = {x => new <>f__AnonymousType1`1(domComplete = x.domComplete)}

                        var gguser = currentGroup.upperSelect.selectorExpression as LambdaExpression;
                        // [0] = {gg}

                        var xMemberExpression = asMemberExpression.Expression as MemberExpression;
                        if (xMemberExpression != null)
                        {
                            // xMemberExpression = {gg.Key}
                            var xMParameterExpression = xMemberExpression.Expression as ParameterExpression;

                            if (xMParameterExpression.Name == gguser.Parameters[0].Name)
                            {
                                // are we talking about the group key member?

                                // thats not available inside here yet

                                var xNewExpression = (currentGroup.keySelector as LambdaExpression).Body as NewExpression;

                                // xNewExpression = {new <>f__AnonymousType1`1(goo = x.domComplete)}
                                // asMemberExpression = {gg.Key.goo}

                                var i = xNewExpression.Members.IndexOf(z => z.Name == asMemberExpression.Member.Name);


                                // group by, the inner source
                                s += "s";
                                s += ".";


                                s += "`";
                                s += "" + (xNewExpression.Arguments[i] as MemberExpression).Member.Name;
                                s += "`";
                                return;
                            }
                        }
                    }


                    var xParameterExpression = asMemberExpression.Expression as ParameterExpression;
                    if (xParameterExpression != null)
                    {
                        var xLambdaExpression = ((that as QueryStrategyOfTRowExtensions.INestedQueryStrategy).upperSelect.selectorExpression as LambdaExpression);
                        if (xLambdaExpression.Parameters[0].Name == xParameterExpression.Name)
                        {
                            // local?
                        }
                        else
                        {
                            // selecting it as we speak..?
                            s += "" + xParameterExpression.Name;
                            s += ".";
                        }
                    }
                }
                else
                {
                    // ?
                }

                s += "`";
                s += "" + asMemberExpression.Member.Name;
                s += "`";
                return;
            }
            #endregion


            #region WriteExpression::UnaryExpression
            var asUnaryExpression = asExpression as UnaryExpression;
            if (asUnaryExpression != null)
            {
                if (asUnaryExpression.NodeType == ExpressionType.Convert)
                {
                    // X:\jsc.svn\examples\javascript\LINQ\test\TestSelectOrUnaryExpression\TestSelectOrUnaryExpression\ApplicationWebService.cs
                    state.WriteExpression(ref s, asUnaryExpression.Operand, that);
                }
                else if (asUnaryExpression.NodeType == ExpressionType.Not)
                {
                    s += "not(";

                    state.WriteExpression(ref s, asUnaryExpression.Operand, that);

                    s += ")";
                }
                else
                {
                    Debugger.Break();
                }

                return;
            }
            #endregion



            // asExpression = {IsNullOrEmpty(x.path)}


            #region WriteExpression:asMethodCallExpression
            var asMethodCallExpression = asExpression as MethodCallExpression;
            if (asMethodCallExpression != null)
            {
                // now what?

                if (asMethodCallExpression.Method.DeclaringType == typeof(string))
                {
                    // asMethodCallExpression.Method = {Boolean Contains(System.String)}

                    #region refToLower
                    var refToLower = new Func <string>("".ToLower).Method;
                    if (refToLower.Name == asMethodCallExpression.Method.Name)
                    {
                        s += "lower(";

                        var arg0 = asMethodCallExpression.Object;
                        state.WriteExpression(ref s, arg0, that);

                        s += ")";
                        return;
                    }
                    #endregion


                    #region refToUpper
                    var refToUpper = new Func <string>("".ToUpper).Method;
                    if (refToUpper.Name == asMethodCallExpression.Method.Name)
                    {
                        s += "upper(";

                        var arg0 = asMethodCallExpression.Object;
                        state.WriteExpression(ref s, arg0, that);

                        s += ")";
                        return;
                    }
                    #endregion


                    #region refContains
                    var refContains = new Func <string, bool>("".Contains).Method;
                    if (refContains.Name == asMethodCallExpression.Method.Name)
                    {
                        var arg1 = asMethodCallExpression.Arguments[0];
                        // arg1 = {"C"}
                        var arg0 = asMethodCallExpression.Object;
                        // arg0 = {x.path}


                        s += "(replace(";

                        state.WriteExpression(ref s, arg0, that);
                        s += ", ";

                        state.WriteExpression(ref s, arg1, that);

                        s += ", '')<>";

                        state.WriteExpression(ref s, arg0, that);
                        s += ")";

                        return;
                    }
                    #endregion


                    #region refIsNullOrEmpty
                    var refIsNullOrEmpty = new Func <string, bool>(string.IsNullOrEmpty).Method;
                    if (refIsNullOrEmpty.Name == asMethodCallExpression.Method.Name)
                    {
                        // the first method

                        // [0] = {x.path}
                        var arg1 = asMethodCallExpression.Arguments[0] as MemberExpression;

                        var xColumnName0 = arg1.Member.Name;

                        // ?
                        s += "`" + xColumnName0 + "` is null or length(`" + xColumnName0 + "`) = 0";

                        return;
                    }
                    #endregion
                }

                Debugger.Break();
            }
            #endregion



            Debugger.Break();
        }