예제 #1
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return("tan(" + Operand.ToSql(builder) + ")");
 }
예제 #2
0
        public override string ToSql(ExpressionSqlBuilder builder)
        {
            string s = Operand1.ToSql(builder) + " in " + Operand2.ToSql(builder);

            return(s);
        }
예제 #3
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return(Operand.ToSql(builder) + " is null");
 }
예제 #4
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return("null");
 }
예제 #5
0
        private string DoToSql(ExpressionSqlBuilder builder)
        {
            //добавляем колонки
            StringBuilder       sqlColumns   = new StringBuilder();
            List <ColumnClause> ColumnsLocal = GetAllColumns();
            int i = 0;

            foreach (var cs in ColumnsLocal)
            {
                if (i != 0)
                {
                    sqlColumns.Append(", ");
                }
                sqlColumns.Append(cs.ToSql(builder));
                //if (!string.IsNullOrEmpty(cs.InternalDbAlias)) sqlColumns.Append(" as ").Append(BaseExpressionFactory.TableSqlCodeEscape(cs.InternalDbAlias)).Append(" ");
                i++;
            }

            StringBuilder sqlTables = new StringBuilder();

            if (Tables.Count > 0)
            {
                sqlTables.Append("from ");
            }
            i = 0;
            foreach (TableClause st in Tables)
            {
                if (i != 0)
                {
                    switch (st.Join)
                    {
                    case JoinType.Cross:
                        sqlTables.Append(" CROSS JOIN ");
                        break;

                    case JoinType.Full:
                        sqlTables.Append(" FULL JOIN ");
                        break;

                    case JoinType.Left:
                        sqlTables.Append(" LEFT JOIN ");
                        break;

                    case JoinType.Right:
                        sqlTables.Append(" RIGHT JOIN ");
                        break;

                    case JoinType.Inner:
                        sqlTables.Append(" INNER JOIN ");
                        break;
                    }
                }

                sqlTables.Append(st.ToSql(builder));
                //if (!string.IsNullOrEmpty(st.Alias)) sqlTables.Append(" as ").Append(BaseExpressionFactory.TableSqlCodeEscape(st.Alias)).Append(" ");


                if (i != 0 && st.Join != JoinType.Cross)
                {
                    sqlTables.Append(" ON ").Append(st.OnExpression.ToSql(builder));
                }
                sqlTables.Append(" ");
                i++;
            }
            //sqlSb.Append(" ");
            string sqlWhere = "";

            if (WhereExpr != null)
            {
                sqlWhere  = " where ";
                sqlWhere += WhereExpr.ToSql(builder);
            }
            StringBuilder sqlGroups = new StringBuilder();

            if (GroupBys != null && GroupBys.Count > 0)
            {
                sqlGroups.Append(" group by ");
                i = 0;
                foreach (GroupByClause groupBy in GroupBys)
                {
                    if (i != 0)
                    {
                        sqlGroups.Append(", ");
                    }
                    sqlGroups.Append(groupBy.ToSql(builder));
                    i++;
                }
            }
            string orderby = "";

            if (OrderBys != null && OrderBys.Count > 0)
            {
                foreach (var ob in OrderBys)
                {
                    if (!string.IsNullOrEmpty(orderby))
                    {
                        orderby += ", ";
                    }
                    orderby += ob.ToSql(builder);
                }
                if (!string.IsNullOrEmpty(orderby))
                {
                    orderby = " ORDER BY " + orderby;
                }
            }

            string sql = "";

            //вместе с ограничениями

            if (builder.DbType == DriverType.SqlServer)
            {
                if (SkipRecords == 0)
                {
                    return(string.Format("select {6}{5}{0} {1} {2} {3} {4}", sqlColumns.ToString(), sqlTables.ToString(), sqlWhere, sqlGroups.ToString(), orderby,
                                         Distinct ? "distinct " : "",
                                         LimitRecords > 0 ? "top " + LimitRecords.ToString() + " " : ""));
                }

                if (string.IsNullOrEmpty(orderby))
                {
                    orderby = "ORDER BY (SELECT null)";
                }

                StringBuilder aliasesCol = new StringBuilder();
                for (int i2 = 0; i2 < ColumnsLocal.Count; i2++)
                {
                    if (i2 != 0)
                    {
                        aliasesCol.Append(", ");
                    }
                    aliasesCol.Append(builder.EncodeTable(ColumnsLocal[i2].InternalDbAlias));
                }

                sql  = string.Format(@"
select {0} from
(
   SELECT {6} {2}, Row_Number()  OVER ({1}) as ""num19376194i9"" {3} {4} {5}
)as t2 where ", aliasesCol.ToString(), orderby, sqlColumns.ToString(), sqlTables.ToString(), sqlWhere, sqlGroups.ToString(), Distinct ? " distinct " : "");
                sql += "\"num19376194i9\" > " + SkipRecords.ToString();
                if (LimitRecords >= 0)
                {
                    sql += " and \"num19376194i9\" <= " + (LimitRecords + SkipRecords).ToString();
                }
            }
            if (builder.DbType == DriverType.PostgreSQL)
            {
                sql = string.Format("select {5} {0} {1} {2} {3} {4}", sqlColumns.ToString(), sqlTables.ToString(), sqlWhere, sqlGroups.ToString(), orderby, Distinct ? " distinct " : "");
                if (SkipRecords > 0)
                {
                    sql += "  OFFSET " + SkipRecords.ToString();
                }
                if (LimitRecords >= 0)
                {
                    sql += " LIMIT " + LimitRecords.ToString();
                }
            }
            return(sql);
        }
예제 #6
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return(Child().ToSql(builder));
 }
예제 #7
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return("(" + Childs[0].ToSql(builder) + " BETWEEN " + Childs[2].ToSql(builder) + " AND " + Childs[1].ToSql(builder) + ")");
 }
예제 #8
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return("right(" + Operand1.ToSql(builder) + "," + Operand2.ToSql(builder) + ")");
 }
예제 #9
0
        protected string ToMSSql(ExpressionSqlBuilder builder)
        {
            StringBuilder sb = new StringBuilder();

            if (AlterType == AlterType.RenameTable)
            {
                var p1 = builder.SqlConstant(Table.ToSql(builder));

                var p2 = builder.SqlConstant(NewName);
                sb.AppendFormat("EXEC sp_rename {0}, {1}", p1, p2).Append(";");
            }
            if (AlterType == AlterType.RenameSchema)
            {
                sb.AppendFormat("ALTER SCHEMA {0} TRANSFER ", builder.EncodeTable(NewName)).Append(";");
                sb.Append(Table.ToSql(builder));
            }
            if (AlterType == AlterType.RenameColumn)
            {
                string s = "";
                s += Table.ToSql(builder);

                var p1 = builder.SqlConstant(s);
                var p2 = builder.SqlConstant(NewName);
                sb.AppendFormat("EXEC sp_RENAME {0}, {1}, 'COLUMN'", p1, p2).Append(";");
            }
            if (AlterType == AlterType.AlterColumn)
            {
                if (AlterColumns.Count > 0)
                {
                    sb.Append("ALTER TABLE ").Append(Table.ToSql(builder)).Append(" ");
                    var addCols = AlterColumns.Where(a => a.AlterColumn == AlterColumnType.AddColumn).ToList();
                    if (addCols.Count > 0)
                    {
                        sb.Append(" ADD ");
                        for (int i = 0; i < addCols.Count; i++)
                        {
                            var ac = addCols[i];
                            if (i > 0)
                            {
                                sb.Append(", ");
                            }
                            sb.Append(ac.ToSql(builder));
                        }
                    }
                    var dropCols = AlterColumns.Where(a => a.AlterColumn == AlterColumnType.DropColumn).ToList();
                    if (dropCols.Count > 0)
                    {
                        sb.Append(" DROP ");
                        for (int i = 0; i < dropCols.Count; i++)
                        {
                            var ac = dropCols[i];
                            if (i > 0)
                            {
                                sb.Append(", ");
                            }
                            sb.Append(ac.ToSql(builder));
                        }
                    }
                    var alterCols = AlterColumns.Where(a => a.AlterColumn == AlterColumnType.AlterColumn).ToList();
                    if (alterCols.Count > 0)
                    {
                        sb.Append(" ALTER COLUMN ");
                        for (int i = 0; i < alterCols.Count; i++)
                        {
                            var ac = alterCols[i];
                            if (i > 0)
                            {
                                sb.Append(", ");
                            }
                            sb.Append(ac.ToSql(builder));
                        }
                    }

                    sb.Append(";");
                }
            }
            return(sb.ToString());
        }
예제 #10
0
 public override string  ToSql(ExpressionSqlBuilder builder)
 {
     return("cast(" + Operand.ToSql(builder) + " as " + ToType.ToSql(builder) + ")");
 }
예제 #11
0
 /// <summary>
 /// Используется для:
 ///  insert into xx ([вот здесь])
 ///  update xx set [вот здесь]=..
 ///  select OVER ( ORDER BY [вот здесь] ) from ...
 /// </summary>
 public string ToSqlShort(ExpressionSqlBuilder builder)
 {
     return(builder.EncodeTable(PhysicalColumn.PhysicalName));
 }
예제 #12
0
        public override string ToSql(ExpressionSqlBuilder builder)
        {
            StringBuilder sb = new StringBuilder();

            if (builder.DbType == DriverType.SqlServer)
            {
                if (IfNotExists)
                {
                    var p = builder.SqlConstant(IndexName.ToSql(builder, true));
                    sb.Append(string.Format("IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = {0}) ", p));
                }

                sb.Append("CREATE");
                if (Unique)
                {
                    sb.Append(" UNIQUE");
                }
                sb.Append(" INDEX");
                sb.Append(" ").Append(IndexName.ToSql(builder));
                sb.Append(" ON ").Append(OnTable.ToSql(builder));
                sb.Append(" (");
                for (int i = 0; i < IndexColumns.Count; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    var ac = IndexColumns[i];
                    sb.Append(builder.EncodeTable(ac.Name));
                    if (ac.Sort == ParserCore.SortType.ASC)
                    {
                        sb.Append(" ASC");
                    }
                    else
                    {
                        sb.Append(" DESC");
                    }
                }
                sb.Append(");");
            }
            if (builder.DbType == DriverType.PostgreSQL)
            {
                string create = "CREATE";
                if (Unique)
                {
                    create += " UNIQUE";
                }
                create += (" INDEX");
                create += " " + IndexName.ToSql(builder);
                create += " ON " + OnTable.ToSql(builder);
                create += " (";
                for (int i = 0; i < IndexColumns.Count; i++)
                {
                    if (i > 0)
                    {
                        create += ", ";
                    }
                    var ac = IndexColumns[i];
                    create += builder.EncodeTable(ac.Name);
                    if (ac.Sort == ParserCore.SortType.ASC)
                    {
                        create += " ASC";
                    }
                    else
                    {
                        create += " DESC";
                    }
                }
                create += ");";

                if (!IfNotExists)
                {
                    sb.Append(create);
                }
                else
                {
                    string schema = "public";
                    if (!string.IsNullOrEmpty(OnTable.Schema))
                    {
                        schema = OnTable.Schema;
                    }
                    var schemaP = builder.SqlConstant(schema);
                    var tableP  = builder.SqlConstant(OnTable.Name);
                    var indexP  = builder.SqlConstant(IndexName);

                    string s = string.Format(@"
do
$$
declare 
   l_count integer;
begin
  select count(*)
     into l_count
  from pg_indexes
    where schemaname = {0}
    and tablename = {1}
    and indexname = {2};

  if l_count = 0 then 
     {3}
  end if;

end;
$$;", schemaP, tableP, indexP, create);
                    sb.Append(s);
                }
            }
            return(sb.ToString());
        }
예제 #13
0
 public override string ToSql(ExpressionSqlBuilder builder)
 {
     return(Operand1.ToSql(builder) + " is " + Operand2.ToSql(builder));
 }
예제 #14
0
        public static void TestGen()
        {
            Console.Title = "Expression2SqlTest";
            //var query =
            //    new QueryBuilder<UserInfo>()
            //    .Join<Account>(x=>x.Id,x=>x.UserId)
            //    .Where(
            //        x =>
            //              x.Id != 999 ||                          // where Id is not null
            //      x.Name == "速度"//&& x.Id == 15
            //       && x.Id > 18
            //            //x.DTCreate > from && x.DTCreate < to &&
            //            //(x.Name == "Test" || x.HasDelete)

            //            )
            //        //.GroupBy(x => x.Age, x => x.Name)
            //        //.OrderBy(x => x.Name)
            //        //.Sum(x => x.Age)
            //        .Select();

            //Console.WriteLine(query);


            //通过静态属性DatabaseType或者静态方法Init均可配置数据库类型
            //ExpressionSqlBuilder.DatabaseType = ExpDbType.SQLServer;
            ExpressionSqlBuilder.DatabaseType = ExpDbType.MySQL;
            //ExpressionSqlBuilder.DatabaseType = ExpDbType.Oracle;
            //ExpressionSqlBuilder.DatabaseType = ExpDbType.SQLite;
            //ExpressionSqlBuilder.DatabaseType = ExpDbType.PostgreSQL;
            //ExpressionSqlBuilder.Init(DatabaseType.SQLServer);

            #region Ext

            string dbName = "TestSqlServer";
            TableMapperContainer tbContainer = new TableMapperContainer(dbName);
            tbContainer.Add <UserInfo>(new TableMap <UserInfo>("TB_USER"));
            //tbContainer.Add<Account>(new TableMap<Account>("TB_COMPANY"));
            ExpressionSqlBuilder.TableMapperContainer = tbContainer;
            bool     hasDel       = false;
            DateTime now          = DateTime.Now;
            string   testTrimStr  = " 李佳佳 ";
            DateTime startTime    = new DateTime(2015, 3, 2, 6, 5, 12);
            DateTime endTime      = new DateTime(2016, 1, 1, 0, 0, 0);
            Guid     guid         = Guid.NewGuid();
            int      intValue     = -32;
            double   decimalValue = 20.8251;

            UserInfo info = new UserInfo();
            info.Id   = 5;
            info.Name = "莱卡布";


            var testID = info.Id;

            FluentExpressionSqlBuilder b = new FluentExpressionSqlBuilder(ExpDbType.MySQL);
            //DbMocker.NewDataBase().FluentSqlBuilder.Select<UserInfo>((p) => new { p })
            //  .Where(p => p.Id > 30)
            //  .OrderBy(p => p.DTCreate)
            //  .TakePage(1, 10)
            //  .ExecuteList();


            //return;
            var idstr     = "44";
            var testUpstr = "SFsdTgsH,";
            var expresion = PredicateExpressions.True <UserInfo>();
            expresion = expresion.And(p => p.HasDelete == true && true && p.Name.ToLower() == info.Name.ToLower() && true);
            // expresion = expresion.And(p =>  p.Id == info.Id && p.Name.ToLower() == info.Name.ToLower());

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Name).
                Where(u => SqlFuncs.In(u.Name, new string[] { "a", "b" })),
                "查询单表,带where in条件,写法三"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => p.HasDelete == true),
                "bool测试"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => p.Name == "ggg )"),
                "SQL注入检查"
                );
            List <string> listNames = new List <string>()
            {
                "'li ')", "huang", "gao"
            };

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => listNames.Contains(p.Name)),
                "数组in测试"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(expresion),
                "true传入测试1=1"
                );

            expresion = PredicateExpressions.False <UserInfo>();
            expresion = expresion.Or(p => p.HasDelete == true || p.Name.ToLower() == info.Name.ToLower());
            // expresion = expresion.And(p =>  p.Id == info.Id && p.Name.ToLower() == info.Name.ToLower());
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(expresion),
                "true传入测试1=0"
                );

            expresion = PredicateExpressions.True <UserInfo>();
            expresion = expresion.And(p => p.HasDelete == true || true && p.Name.ToLower() == info.Name.ToLower() && true);
            // expresion = expresion.And(p =>  p.Id == info.Id && p.Name.ToLower() == info.Name.ToLower());
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(expresion),
                "混合true传入测试1=1"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => p.Name.ToLower().ToUpper() == testUpstr.ToLower().ToUpper().TrimEnd(',')),
                // ExpressionSqlBuilder.Select<UserInfo>().Where(p => p.Name.ToUpper().ToLower() == testUpstr.ToLower().ToUpper().TrimEnd(',') && p.Name.ToUpper() == info.Name.Trim().ToUpper()),
                "Trim().Lower().Trim()"
                );
            //return;



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => p.Id == info.Id && p.Id == testID && p.Name.ToLower() == info.Name.ToLower()),
                "传入实体自动校验"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(p => p.Id == info.Id && p.Name == testTrimStr && p.Name.ToLower() == info.Name.ToLower()),
                "传入实体自动校验"
                );



//            Printf(
//    ExpressionSqlBuilder.Select<UserInfo>(u => new { name = CalcAge(5, 9, 5), age = idstr.To<int>() ,  dssdf = CalcName(5, 9, 5)}).Where(u => u.Id == RoleType.经理.GetHashCode() && u.Age == CalcAge(5, 9, 5) && u.Name == CalcName(5, 9, 5))
//    .OrderBy(u => CalcAge(5, 9, 5)),

//    "select和order获取方法值"
//);

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(u => u.Id == RoleType.经理.GetHashCode() && u.Age == CalcAge(5, 9, 5) && u.Name == CalcName(5, 9, 5)),

                "直接获取值"
                );



            var lambda1 = ExpressionSqlBuilder.Select <UserInfo, Account>((p, a) => new { p, a, sdf = p.Id, name4 = a.Name })
                          .LeftJoin <Account>((u, a) => u.Id == a.Id && u.Id == 10 && a.StatusCode == 1);
            // var lambdaWhere = ExpressionSqlBuilder.Where<UserInfo>(p => p.Id > 20 && p.Name == "sdf").Exists<Account>((a, p) => a.Id == p.Id && p.Id > 0);
            var lambdaBuilder            = ExpressionSqlBuilder.NewBuilder <UserInfo>().Where(p => p.Id > 20 && p.Name == "sdf").Exists <Account>((a, p) => a.Id == p.Id && p.Id > 0);
            var lambdaBuilderAnd         = ExpressionSqlBuilder.NewBuilder <UserInfo>().AndIf(false, p => p.Name == "555").ExistsIf <Account>(false, (a, p) => a.Id == p.Id && p.Id > 0);
            var lambdaBuilderOder        = ExpressionSqlBuilder.NewBuilder <UserInfo>().OrderBy(p => p.DTCreate);
            var lambdaBuilderWhereMutil  = ExpressionSqlBuilder.NewBuilder <UserInfo>().SetTableAlias <EmployeeEntity>("newT").Where <EmployeeEntity>((p, pa1) => p.Id > 0 && p.Id == pa1.Id && pa1.Remark == "aaaa").And <Account>((p, pa1) => pa1.Id > 10 && p.Id == pa1.Id);
            var lambdaBuilderWhereMutil2 = ExpressionSqlBuilder.NewBuilder <UserInfo>().SetTableAlias <EmployeeEntity>("newT").Where <EmployeeEntity>((pa1) => pa1.Remark == "aaaa").And <Account>(pa1 => pa1.Id > 10 && pa1.Name == "sdf");

            Printf(
                lambda1.Append(lambdaBuilderWhereMutil2).Append(lambdaBuilderAnd).Append(lambdaBuilderOder)
                ,
                "ExpressionSqlBuilder Append"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((p) => new { p })
                ,
                "Exists  A.* 查询"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((p, a) => new { p, a, sdf = p.Id, name4 = a.Name })
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.StatusCode == 1).Where(p => p.Id > 30)
                ,
                "Exists  查询"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>()
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.StatusCode == 1)
                .Where(p => p.Id > 30)
                ,
                "InnerJoin  查询"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(a =>
                                                               // a.Name.StartsWith("李")
                                                               //&&
                                                               //a.Name.EndsWith("明") &&
                                                               //a.Name.Contains("云") &&
                                                               //a.Id.In(1, 2, 3) &&
                                                               //a.Name.LikeLeft("明") &&
                                                               //a.Name.LikeRight("云") &&
                                                               //a.Name.Like("云") &&
                                                               SqlFuncs.LikeLeft(a.Name, "明")

                                                               //&&
                                                               //SqlFuncs.LikeRight(a.Name, "云") &&
                                                               //SqlFuncs.Like(a.Name, "云")


                                                               ),
                "Like 方法"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => u.Id)
                .Join <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                .Where(p => p.Id > 30).
                Union <Account>().
                Select <Account>((u, a) => new { a.Id, a.Name }).Where(p => p.Id > 10),
                "Union 查询"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => u.Id)
                .Join <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                .Where(p => p.Id > 30)
                // .OrderBy(p => p.Id)
                //  .TakePage(2, 10)
                ,
                "Select  Join 多条件查询"
                );



            Printf(
                ExpressionSqlBuilder.Count <UserInfo>(u => u.Id)
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                .Where(p => p.Id > 10)
                .Exists <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                .OrderBy(p => p.DTCreate).ThenByDescending(p => p.Name)
                .GroupBy(p => p.Id)
                .Having(u => u.Age > 0 && SqlFuncs.Count() > 10)
                .TakeRange(1, 20)
                ,
                "Count Exists 多条件查询2"
                );

            Printf(
                ExpressionSqlBuilder.Count <UserInfo>(u => u.Id)
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                //.Where(p => p.Id > 30)
                // .OrderBy(p => p.Id)
                //  .TakePage(2, 10)
                ,
                "Count  多条件查询"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, AID = a.Id, a.Name })
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.Age > 10 && u.Id > 5)
                //.Where(p => p.Id > 30)
                // .OrderBy(p => p.Id)
                //  .TakePage(2, 10)
                ,
                "Select InnerJoin 多条件查询"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name })
                .LeftJoin <Account>((u, a) => u.Id == a.Id && a.Id > 0 || a.Name == dbName && a.Name.StartsWith("a"))
                .Where(p => p.Id > 30)
                .OrderBy(p => p.Id)
                .TakePage(2, 10)
                ,
                "InnerJoin 多条件查询"
                );



            Printf(
                ExpressionSqlBuilder.Insert <UserInfo>(() => new UserInfo {
                DTCreate = DateTime.Now, Name = "567", Sex = 1, Email = "*****@*****.**"
            }),
                "Insert带SQL 日期函数"
                );

            List <int> ids = new List <int>()
            {
                1, 2, 3
            };
            List <string> names = new List <string>()
            {
                "abc", "efg"
            };
            List <string> nameNots = new List <string>()
            {
                "xyz"
            };
            string ss = "";
            //q.Where(a => ids.Contains(a.Id)).ToList();
            //   Printf(
            //       //ExpressionSqlBuilder.Select<UserInfo>().Where(u => u.Id > 0 && names.Contains(u.Name) && ids.Contains(u.Id)),
            //    ExpressionSqlBuilder.Select<UserInfo>().Where(u => u.Name.Contains(ss)),

            //    "数组contains包含"
            //);


            //    Printf(
            //    ExpressionSqlBuilder.Select<UserInfo>(u => new { name = CalcAge(5, 9, 5) , age = idstr.To<int>() }).Where(u => u.Id == RoleType.经理.GetHashCode() && u.Age == CalcAge(5, 9, 5))
            //    .OrderBy(u => CalcAge(5, 9, 5)),

            //    "select和order获取方法值"
            //);

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(u => u.Id == RoleType.经理.GetHashCode() && u.Age == CalcAge(5, 9, 5)),

                "直接获取值"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(u => ids.Contains(u.Id) && SqlFuncs.In(u.Name, names) || SqlFuncs.InNot(u.Name, nameNots)),

                "集合相关函数"
                );

            //from cache
            //string sql = b.FromCache( (a) => {
            //    return a.Select<UserInfo>().Where(p => p.Age > 5).ToSqlString();
            //});
            //Print(sql);

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new { p.Id, p.Name }).Where(p => p.Age > 50 && p.Id > 1),
                "测试聚合根Enity"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                p.Role
            }).Where(p => p.Role == RoleType.普通用户).OrderBy(p => p.Role),
                "Enum枚举"
                );

            //Printf(
            //           ExpressionSqlBuilder.Select<UserInfo>(p => new
            //           {
            //               intValue,
            //               CountValue = p.Age.Count(),
            //               SumValue = p.Age.Sum(),
            //               MaxValue = p.Age.Max(),
            //               MinValue = p.Age.Min(),
            //               AvgValue = p.Age.Avg(),
            //           }),
            //           "聚合函数"
            //       );


            Printf(
                ExpressionSqlBuilder.
                Select <UserInfo>().
                Where(u => SqlFuncs.In(u.Id, 1, 2, 3) &&
                      SqlFuncs.Like(u.Name, "a") &&
                      SqlFuncs.LikeLeft(u.Name, "b") &&
                      SqlFuncs.LikeRight(u.Name, "c")
                      ),
                "SqlFuncs的列子"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                intValue,
                CountValue = SqlFuncs.Count(),
                SumValue   = SqlFuncs.Sum(p.Age),
                MaxValue   = SqlFuncs.Max(p.Age),
                MinValue   = SqlFuncs.Min(p.Age),
                AvgValue   = SqlFuncs.Avg(p.Age),
            }),
                "聚合函数"
                );

            //Printf(
            //           ExpressionSqlBuilder.Select<UserInfo>(p => new
            //           {
            //               NewGuid = Guid.NewGuid(),
            //           }).Where(p => Guid.NewGuid() == guid).OrderBy(p => Guid.NewGuid()).EndOrder(),
            //           "New Guid函数"
            //       );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                //CaseWhen = p.Age == null ? false : (p.Age > 20 ? true : false),
                //CaseWhen1 = p.Age == null ? (p.Age > 20 ? true : false) :  false,
                年龄  = p.Age,
                年龄段 = p.Age < 15 ?
                      "少年" :
                      ((p.Age > 60) ?
                       "老年" :
                       (p.Age > 40) ? "中年" :
                       "青年")
            }),
                "Case When方法"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                Abs              = Math.Abs(p.Id),
                AbsVAR           = Math.Abs(intValue),
                Round            = Math.Round(decimalValue, 2),
                RoundNoPrecision = Math.Round(decimalValue),
                Ceiling          = Math.Ceiling(decimalValue),
                Floor            = Math.Floor(decimalValue),

                Sqrt = Math.Sqrt(decimalValue),
                Log  = Math.Log(decimalValue, 23),
                Pow  = Math.Pow(decimalValue, 2),
                Sign = Math.Sign(decimalValue),
                //Truncate = Math.Truncate(decimalValue),

                //ModV = ExDbFunction.Mod(decimalValue, 6),
                Rand    = SqlFuncs.Rand(),
                IfNullV = SqlFuncs.IfNull(p.Name, "李梅"),
            }),
                "数学函数"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                AddYearsVAR = p.DTCreate.AddYears(1),      //DATEADD(YEAR,1,@P_0)
                AddYears    = p.DTCreate.AddYears(1),      //DATEADD(YEAR,1,@P_0)
                AddMonths   = p.DTCreate.AddMonths(1),     //DATEADD(MONTH,1,@P_0)
                AddDays     = p.DTCreate.AddDays(1),       //DATEADD(DAY,1,@P_0)
                AddHours    = p.DTCreate.AddHours(1),      //DATEADD(HOUR,1,@P_0)
                AddMinutes  = p.DTCreate.AddMinutes(2),    //DATEADD(MINUTE,2,@P_0)
                AddSeconds  = p.DTCreate.AddSeconds(120),  //DATEADD(SECOND,120,@P_0)
                //AddMilliseconds = startTime.AddMilliseconds(20000),//DATEADD(MILLISECOND,20000,@P_0)
            }).Where(p => p.DTCreate.AddYears(1) > DateTime.Now),
                "Add DateTime函数"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                DiffYearsVAR = endTime.DiffYears(now),
                DiffYears    = p.DTCreate.DiffYears(now),
                DiffMonths   = endTime.DiffMonths(now),
                DiffDays     = endTime.DiffDays(now),
                DiffHours    = endTime.DiffHours(now),
                DiffMinutes  = endTime.DiffMinutes(now),
                DiffSeconds  = endTime.DiffSeconds(now),
                //DiffMilliseconds = endTime.DiffMilliseconds(now),//MAYBE FAIL : OUT BOUND OF INT RANGE
                //DiffMicroseconds = endTime.DiffMicroseconds(now),//MAYBE FAIL : OUT BOUND OF INT RANGE
            }).Where(p => p.DTCreate.DiffDays(now) > 2),   //两天前过滤
                "Diff DateTime函数"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                长度        = p.Name.Length,
                大写        = p.Email.ToUpper(),
                小写        = p.Email.ToLower(),
                TrimStart = " 李佳佳 ".TrimStart(),
                TrimEnd   = testTrimStr.TrimEnd(),
                Trim      = testTrimStr.Trim(),
                ToString  = testTrimStr.ToString(),
                Substring = testTrimStr.Substring(1, 2),
                SubstringWithAutoLength = p.Email.Substring(1),
                IsNullOrEmpty           = string.IsNullOrEmpty(p.Email) ? "空" : "非空"
            }).Where(p =>
                     //p.Email.Substring(1,2) == "A"
                     // p.Email.ToUpper() == "AAA"// &&
                     // p.Name.StartsWith("ss")
                     string.IsNullOrWhiteSpace(p.Email)


                     ),
                "长度Length函数"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new
            {
                Int_Parse       = int.Parse("33"),
                Byte_Parse      = byte.Parse("11"),
                Short_Parse     = short.Parse("22"),
                Long_Parse      = long.Parse("2123123213"),              //CAST(N'2' AS BIGINT)
                Sbyte_Parse     = sbyte.Parse("12"),                     //CAST(N'11' AS SMALLINT)
                Int16_Parse     = Int16.Parse("12211"),                  //CAST(N'11' AS SMALLINT)
                Int32_Parse     = Int32.Parse("44"),                     //CAST(N'1' AS INT)
                Int64_Parse     = Int64.Parse("12211"),                  //CAST(N'11' AS SMALLINT)
                Double_Parse    = double.Parse("3213.2516"),             //CAST(N'3' AS FLOAT)
                DoubleUP_Parse  = Double.Parse("3213.2516"),             //CAST(N'3' AS FLOAT)
                Float_Parse     = float.Parse("4123.213"),               //CAST(N'4' AS REAL)
                Decimal_Parse   = decimal.Parse("25222.234454"),         //CAST(N'5' AS DECIMAL) , ONLY SUPPORT 4 PERCION
                DecimalUP_Parse = Decimal.Parse("5222.234454"),          //CAST(N'5' AS DECIMAL)
                Bool_Parse      = bool.Parse("true"),                    //CAST(N'4' AS REAL)
                Bool_INT_Parse  = bool.Parse("1"),                       //CAST(N'4' AS REAL)
                DateTime_Parse  = DateTime.Parse("2014-05-21 22:10:05"), //CAST(N'4' AS REAL)
                Guid_Parse      = Guid.Parse("D544BC4C-739E-4CD3-A3D3-7BF803FCE179"),
            }).Where(p => p.Age > int.Parse("33")),
                "Parse转换函数"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().Where(a =>
                                                               a.Name.StartsWith("李") &&
                                                               a.Name.EndsWith("明") &&
                                                               a.Name.Contains("云") &&
                                                               //a.Id.In(1, 2, 3) &&
                                                               //a.Name.LikeLeft("明") &&
                                                               //a.Name.LikeRight("云") &&
                                                               //a.Name.Like("云") &&
                                                               SqlFuncs.LikeLeft(a.Name, "明") &&
                                                               SqlFuncs.LikeRight(a.Name, "云") &&
                                                               SqlFuncs.Like(a.Name, "云")


                                                               ),
                "Like 方法"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(a => new
            {
                AddV      = 1 + 2,
                SubtractV = 2 - 1,
                MultiplyV = 2 * 11,
                DivideV   = 4 / 2,
                AndV      = true & false,
                IntAndV   = 1 & 2,
                OrV       = true | false,
                IntOrV    = 3 | 1,
            }),
                "运算符"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { u.Age, 现在时间 = now, u.Name, 局部变量 = "23" })
                .OrderBy(p => p.Age).
                ThenByDescending(p => p.Name).
                TakePage(3, 15),
                "分页GetPage"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { u.Age, 现在时间 = now, u.Name, 局部变量 = "23" })
                .OrderBy(p => p.Age).
                ThenByDescending(p => p.Name).
                TakeRange(3, 15),
                "查询范围GetRange"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { 现在时间 = now, 局部变量 = "23" }),
                "局部变量选择"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { 现在时间 = now, 局部变量 = "23" }).Top(3),
                "Top"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { 现在时间 = now, 局部变量 = "23" }).Distinct(),
                "Distinct"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new
            {
                现在时间   = now,
                属性现在时间 = DateTime.Now,
                UTC时间  = DateTime.UtcNow,
                今天     = DateTime.Today,
                日期部分   = now.Date,
                年2     = u.DTCreate.Year,
                年      = now.Year,
                月      = now.Month,
                日      = now.Day,
                时      = now.Hour,
                分      = now.Minute,
                秒      = now.Second
                         //,
                         //毫秒 = now.Millisecond
                ,
                本周第几天0是周日 = now.DayOfWeek
            }),
                "日期函数操作"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { BV = true, CNAME = u.Name, u.Name, CID = u.Id }
                                                       ).
                Where(u =>
                      //u.Id.In(1, 2, 3)
                      //&&
                      u.HasDelete == false // == hasDel
                      )                    //.Where(" a.Name ={0}", "李四").Where(" a.Name ={0} and a.ID >0 ", "张茂")
                ,
                "拼接Where字符串"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { CNAME = u.Name, u.Name, CID = u.Id }).
                Where(u =>
                      SqlFuncs.In(u.Id, 1, 2, 3)
                      &&
                      u.HasDelete == false      // == hasDel
                      ).And(" a.Name ={0}", "李四").Or(" a.Name ={0} and a.ID >{1} ", "张茂", 5),
                "拼接And/Or字符串"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { CNAME = u.Name, u.Name, CID = u.Id }).OrderBy(p => p.Age).
                ThenByDescending(p => p.Name),
                "正常排序"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { CNAME = u.Name, u.Name, CID = u.Id })
                .OrderByString("a.DTCreate desc "),
                "自定义排序字符串"
                );


            string strName = "李四";

            var from = DateTime.UtcNow.AddDays(-1);
            var to   = DateTime.UtcNow;
            Printf(
                ExpressionSqlBuilder.Insert <UserInfo>(() => new UserInfo {
                Name = strName, Sex = 1, Email = "*****@*****.**"
            }),
                "Insert UserInfo插入SQL"
                );

            Printf(

                ExpressionSqlBuilder.Insert <UserInfo>(() => new { CNAME = strName, Sex = 1, Email = "*****@*****.**" }),
                "Insert插入SQL"
                );

            Printf(

                ExpressionSqlBuilder.Select <UserInfo>(u => new { CNAME = u.Name, u.Name, CID = u.Id }).
                Where(x =>
                      x.Name == strName ||            // or  Address is not null
                      x.DTCreate > to
                      ),
                "变量传形参"
                );

            string updatename = "Marilyn";
            Printf(
                ExpressionSqlBuilder.Update <UserInfo>(() => new { Name = updatename, Sex = 1, Email = "*****@*****.**" }).Where(p => p.Id == 1),
                "A full table updates"
                );



            int[] aryId = { 1, 2, 3 };
            Printf(

                ExpressionSqlBuilder.Select <UserInfo>(u => new { CNAME = u.Name, u.Name, CID = u.Id }).
                Where(x =>
                      x.Id != 999 &&                                   // where Id is not null
                      x.Name == "速度" &&     //&& x.Id == 15
                      x.Id > 18 &&
                      aryId.Contains(x.Id) &&           // and Id in (1,2,3)
                      x.Name.StartsWith("张") &&         // and Name like '张%'
                      x.Name.EndsWith("test") &&        // and Remark like '%test'
                      x.Email.Contains("@qq.com") ||    // and Email like '%@qq.com%'
                      x.Email != null                   // or  Address is not null
                      ),
                "查询单表,带where in条件,写法一"
                );


            Printf(
                ExpressionSqlBuilder.Max <UserInfo>(u => u.Name).
                Where(u => SqlFuncs.In(u.Id, 1, 2, 3)),
                "查询单表,带where in条件,写法2"
                );


            #endregion

            #region 高级查询


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name }).Exists <Account>((u, a) => u.Id == a.Id, (p) => p.Id > 10).Where(p => p.Id > 30),
                "Exists 查询"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name }).Where(p => p.Id > 30).Exists <Account>((u, a) => u.Id == a.Id, (p) => p.Id > 10),
                "Exists 查询2"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name }).ExistsNot <Account>((u, a) => u.Id == a.Id, (p) => p.Id > 10).Where(p => p.Id > 30),
                "not Exists 查询"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name }).Where(p => p.Name == "云").
                Union <Account>().
                Select <Account>((u, a) => new { a.Id, a.Name }).Where(p => p.Id > 10),
                "Union 查询"
                );
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>((u) => new { u.Id, u.Name }).
                UnionAll <Account>().
                Select <Account>((u, a) => new { a.Id, a.Name }).Where(p => p.Id > 10),
                "Union All 查询"
                );
            #endregion


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(),
                "查询单表所有字段"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Id),
                "查询单表单个字段"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => new { u.Id, u.Name }),
                "查询单表多个字段"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Id).
                Where(u => SqlFuncs.Like(u.Name, "b")),
                "查询单表,带where Like条件"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Id).
                Where(u => SqlFuncs.LikeLeft(u.Name, "b")),
                "查询单表,带where LikeLeft条件"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Id).
                Where(u => SqlFuncs.LikeRight(u.Name, "b")),
                "查询单表,带where LikeRight条件"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Name).
                Where(u => SqlFuncs.In(u.Id, 1, 2, 3)),
                "查询单表,带where in条件,写法一"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Name).
                Where(u => SqlFuncs.In(u.Id, aryId)),
                "查询单表,带where in条件,写法二"
                );

            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Name).
                Where(u => SqlFuncs.In(u.Name, new string[] { "a", "b" })),
                "查询单表,带where in条件,写法三"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(u => u.Id).
                Where(
                    u => u.Name == "b" &&
                    u.Id > 2 &&
                    u.Name != null &&
                    u.Id > int.MinValue &&
                    u.Id < int.MaxValue &&
                    SqlFuncs.In(u.Id, 1, 2, 3) &&
                    SqlFuncs.Like(u.Name, "a") &&
                    SqlFuncs.LikeLeft(u.Name, "b") &&
                    SqlFuncs.LikeRight(u.Name, "c") ||
                    u.Id == null
                    ),
                "查询单表,带多个where条件"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, a.Name }).
                Join <Account>((u, a) => u.Id == a.UserId),
                "多表Join关联查询"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, a.Name }).
                InnerJoin <Account>((u, a) => u.Id == a.UserId),
                "多表InnerJoin关联查询"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, a.Name }).
                LeftJoin <Account>((u, a) => u.Id == a.UserId),
                "多表LeftJoin关联查询"
                );



            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, a.Name }).
                RightJoin <Account>((u, a) => u.Id == a.UserId),
                "多表RightJoin关联查询"
                );


            Printf(
                ExpressionSqlBuilder.Select <UserInfo, Account>((u, a) => new { u.Id, a.Name }).
                FullJoin <Account>((u, a) => u.Id == a.UserId),
                "多表FullJoin关联查询"
                );


            //Printf(
            //     ExpressionSqlBuilder.Select<UserInfo, Account, Student, Class, City, Country>((u, a, s, d, e, f) =>
            //               new { u.Id, a.Name, StudentName = s.Name, ClassName = d.Name, e.CityName, CountryName = f.Name }).
            //               Join<Account>((u, a) => u.Id == a.UserId).
            //               LeftJoin<Account, Student>((a, s) => a.Id == s.AccountId).
            //               RightJoin<Student, Class>((s, c) => s.Id == c.UserId).
            //               InnerJoin<Class, City>((c, d) => c.CityId == d.Id).
            //               FullJoin<City, Country>((c, d) => c.CountryId == d.Id).
            //               Where(u => u.Id != null),
            //     "多表复杂关联查询"
            //);


            Printf(
                ExpressionSqlBuilder.Select <UserInfo>(p => new { p.Age, CountV = SqlFuncs.Sum(p.Age) }).
                GroupBy(u => new { u.Age }).ThenGroupBy(p => p.Id).Having(u => u.Age > 0 && SqlFuncs.Count() > 10),
                "GroupBy分组查询"
                );

            List <string> lll = new List <string>();
            Printf(
                ExpressionSqlBuilder.Select <UserInfo>().
                OrderBy(u => u.Id),
                "OrderBy排序"
                );



            Printf(
                ExpressionSqlBuilder.Max <UserInfo>(u => u.Id),
                "返回一列中的最大值。NULL 值不包括在计算中。"
                );

            Printf(
                ExpressionSqlBuilder.Min <UserInfo>(u => u.Id).Where(p => p.Id == 5),
                "返回一列中的最小值。NULL 值不包括在计算中。"
                );

            Printf(
                ExpressionSqlBuilder.Avg <UserInfo>(u => u.Id),
                "返回数值列的平均值。NULL 值不包括在计算中。"
                );

            Printf(
                ExpressionSqlBuilder.Count <UserInfo>(),
                "返回表中的记录数"
                );

            Printf(
                ExpressionSqlBuilder.Count <UserInfo>(u => u.Id),
                "返回指定列的值的数目(NULL 不计入)"
                );

            Printf(
                ExpressionSqlBuilder.Sum <UserInfo>(u => u.Id),
                "返回数值列的总数(总额)。"
                );


            Printf(
                ExpressionSqlBuilder.Delete <UserInfo>(),
                "全表删除"
                );

            Printf(
                ExpressionSqlBuilder.Delete <UserInfo>().
                Where(u => u.Id == null),
                "根据where条件删除指定表记录"
                );
            Printf(
                ExpressionSqlBuilder.Delete <UserInfo>().
                Where(u => u.Id != null),
                "根据where条件删除指定表记录"
                );

            Printf(
                ExpressionSqlBuilder.Update <UserInfo>(() => new UserInfo {
                Name = "", Sex = 1, Email = "*****@*****.**"
            }),
                "UserInfo全表更新"
                );

            Printf(
                ExpressionSqlBuilder.Update <UserInfo>(() => new { Name = "", Sex = 1, Email = "*****@*****.**" }),
                "全表更新"
                );

            Printf(
                ExpressionSqlBuilder.Update <UserInfo>(() => new { Name = "", Sex = 1, Email = "*****@*****.**" }).
                Where(u => u.Id == 1),
                "根据where条件更新指定表记录"
                );



            //to be continued...
        }