mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 增加 FreeSql.Provider.Dameng 基于 DmProvider Ado.net 访问达梦数据库;#155
This commit is contained in:
		@@ -46,8 +46,23 @@ namespace orm_vs
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static Lazy<IFreeSql> damengLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
 | 
					            .UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user")
 | 
				
			||||||
 | 
					             //.UseConnectionFactory(FreeSql.DataType.Dameng, () => new Dm.DmConnection("data source=127.0.0.1:5236;user id=2user;password=123456789;Pooling=true;Max Pool Size=2"))
 | 
				
			||||||
 | 
					             .UseAutoSyncStructure(true)
 | 
				
			||||||
 | 
					            .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
 | 
					            //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .UseMonitorCommand(
 | 
				
			||||||
 | 
					                cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
 | 
				
			||||||
 | 
					                (cmd, traceLog) => Console.WriteLine(traceLog))
 | 
				
			||||||
 | 
					            .Build());
 | 
				
			||||||
 | 
					        public static IFreeSql dameng => damengLazy.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static void Main(string[] args)
 | 
					        static void Main(string[] args)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            dameng.Select<Song>().ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var testlist1 = fsql.Select<Song>().OrderBy(a => a.Id).ToList();
 | 
					            var testlist1 = fsql.Select<Song>().OrderBy(a => a.Id).ToList();
 | 
				
			||||||
            var testlist2 = new List<Song>();
 | 
					            var testlist2 = new List<Song>();
 | 
				
			||||||
            fsql.Select<Song>().OrderBy(a => a.Id).ToChunk(0, list =>
 | 
					            fsql.Select<Song>().OrderBy(a => a.Id).ToChunk(0, list =>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
 | 
					    <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
 | 
				
			||||||
 | 
					    <ProjectReference Include="..\..\Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj" />
 | 
				
			||||||
    <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
 | 
					    <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
 | 
				
			||||||
    <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
 | 
					    <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,8 +33,24 @@ namespace orm_vs
 | 
				
			|||||||
        //    });
 | 
					        //    });
 | 
				
			||||||
        //}
 | 
					        //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static Lazy<IFreeSql> damengLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
 | 
					            .UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user")
 | 
				
			||||||
 | 
					             //.UseConnectionFactory(FreeSql.DataType.Dameng, () => new Dm.DmConnection("data source=127.0.0.1:5236;user id=2user;password=123456789;Pooling=true;Max Pool Size=2"))
 | 
				
			||||||
 | 
					             .UseAutoSyncStructure(true)
 | 
				
			||||||
 | 
					            .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
 | 
					            //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            .UseMonitorCommand(
 | 
				
			||||||
 | 
					                cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
 | 
				
			||||||
 | 
					                (cmd, traceLog) => Console.WriteLine(traceLog))
 | 
				
			||||||
 | 
					            .Build());
 | 
				
			||||||
 | 
					        public static IFreeSql dameng => damengLazy.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static void Main(string[] args)
 | 
					        static void Main(string[] args)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            dameng.Select<Song>().ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag));
 | 
					            fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag));
 | 
				
			||||||
            //sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
 | 
					            //sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag));
 | 
				
			||||||
            //sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements
 | 
					            //sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,6 +49,10 @@
 | 
				
			|||||||
      <Project>{af9c50ec-6eb6-494b-9b3b-7edba6fd0ebb}</Project>
 | 
					      <Project>{af9c50ec-6eb6-494b-9b3b-7edba6fd0ebb}</Project>
 | 
				
			||||||
      <Name>FreeSql</Name>
 | 
					      <Name>FreeSql</Name>
 | 
				
			||||||
    </ProjectReference>
 | 
					    </ProjectReference>
 | 
				
			||||||
 | 
					    <ProjectReference Include="..\..\Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj">
 | 
				
			||||||
 | 
					      <Project>{e74d90e8-1cbc-4677-817b-1ca05ab97937}</Project>
 | 
				
			||||||
 | 
					      <Name>FreeSql.Provider.Dameng</Name>
 | 
				
			||||||
 | 
					    </ProjectReference>
 | 
				
			||||||
    <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj">
 | 
					    <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj">
 | 
				
			||||||
      <Project>{28c6a39c-7ae7-4210-b7b0-0970216637a8}</Project>
 | 
					      <Project>{28c6a39c-7ae7-4210-b7b0-0970216637a8}</Project>
 | 
				
			||||||
      <Name>FreeSql.Provider.MySql</Name>
 | 
					      <Name>FreeSql.Provider.MySql</Name>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,13 +120,6 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 lambda 条件删除数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -221,15 +214,6 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            批量注入 Repository,可以参考代码自行调整
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="services"></param>
 | 
					 | 
				
			||||||
            <param name="globalDataFilter"></param>
 | 
					 | 
				
			||||||
            <param name="assemblies"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
 | 
					        <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
 | 
					            动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										106
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengDeleteTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengDeleteTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengDeleteTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IDelete<Topic> delete => g.dameng.Delete<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic22211")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int? Clicks { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Dywhere()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Assert.Null(g.dameng.Delete<Topic>().ToSql());
 | 
				
			||||||
 | 
					            var sql = g.dameng.Delete<Topic>(new[] { 1, 2 }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new { id = 1 }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<MultiPkTopic>(new[] { new { Id1 = 1, Id2 = 10 }, new { Id1 = 2, Id2 = 20 } }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"MULTIPKTOPIC\" WHERE (\"ID1\" = 1 AND \"ID2\" = 10 OR \"ID1\" = 2 AND \"ID2\" = 20)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class MultiPkTopic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id1 { get; set; }
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id2 { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Where()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = delete.Where("id = :id", new { id = 1 }).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (id = :id)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item = new Topic { Id = 1, Title = "newtitle" };
 | 
				
			||||||
 | 
					            sql = delete.Where(item).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = delete.Where(items).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TB_TOPIC22211\" WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteAffrows()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var id = g.dameng.Insert<Topic>(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteIdentity();
 | 
				
			||||||
 | 
					            Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteDeleted()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //var item = g.dameng.Insert<Topic>(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteInserted();
 | 
				
			||||||
 | 
					            //Assert.Equal(item[0].Id, delete.Where(a => a.Id == item[0].Id).ExecuteDeleted()[0].Id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AsTable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Assert.Null(g.dameng.Delete<Topic>().ToSql());
 | 
				
			||||||
 | 
					            var sql = g.dameng.Delete<Topic>(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new Topic { Id = 1, Title = "test" }).AsTable(a => "TopicAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).AsTable(a => "TopicAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1 OR \"ID\" = 2)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Delete<Topic>(new { id = 1 }).AsTable(a => "TopicAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										278
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,278 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengInsertTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IInsert<Topic> insert => g.dameng.Insert<Topic>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic_insert")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int? Clicks { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AppendData()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Parse("2019-09-19 22:25:38.697071") });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            var sql = insert.AppendData(items.First()).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("INSERT INTO \"TB_TOPIC_INSERT\"(\"CLICKS\", \"TITLE\", \"CREATETIME\") VALUES(0, 'newtitle0', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(0, 'newtitle0', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(100, 'newtitle1', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(200, 'newtitle2', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(300, 'newtitle3', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(400, 'newtitle4', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(500, 'newtitle5', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(600, 'newtitle6', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(700, 'newtitle7', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(800, 'newtitle8', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(900, 'newtitle9', to_timestamp('2019-09-19 22:25:38.697071','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle0')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle1')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle2')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle3')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle4')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle5')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle6')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle7')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle8')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(0, 'newtitle0')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(100, 'newtitle1')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(200, 'newtitle2')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(300, 'newtitle3')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(400, 'newtitle4')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(500, 'newtitle5')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(600, 'newtitle6')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(700, 'newtitle7')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(800, 'newtitle8')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(900, 'newtitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void InsertColumns()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            var sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle0')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle1')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle2')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle3')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle4')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle5')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle6')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle7')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle8')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""TITLE"") VALUES('newtitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(0, 'newtitle0')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(100, 'newtitle1')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(200, 'newtitle2')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(300, 'newtitle3')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(400, 'newtitle4')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(500, 'newtitle5')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(600, 'newtitle6')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(700, 'newtitle7')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(800, 'newtitle8')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(900, 'newtitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void IgnoreColumns()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            var sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(0, 'newtitle0')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(100, 'newtitle1')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(200, 'newtitle2')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(300, 'newtitle3')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(400, 'newtitle4')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(500, 'newtitle5')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(600, 'newtitle6')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(700, 'newtitle7')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(800, 'newtitle8')
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") VALUES(900, 'newtitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(0)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(100)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(200)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(300)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(400)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(500)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(600)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(700)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(800)
 | 
				
			||||||
 | 
					INTO ""TB_TOPIC_INSERT""(""CLICKS"") VALUES(900)
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					            data.Add(insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.dameng.Delete<TopicIgnore>().Where("1=1").ExecuteAffrows();
 | 
				
			||||||
 | 
					            var itemsIgnore = new List<TopicIgnore>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 2072; a++) itemsIgnore.Add(new TopicIgnore { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					            g.dameng.Insert<TopicIgnore>().AppendData(itemsIgnore).IgnoreColumns(a => new { a.Title }).ExecuteAffrows();
 | 
				
			||||||
 | 
					            Assert.Equal(2072, itemsIgnore.Count);
 | 
				
			||||||
 | 
					            Assert.Equal(2072, g.dameng.Select<TopicIgnore>().Where(a => a.Title == null).Count());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topicICs")]
 | 
				
			||||||
 | 
					        class TopicIgnore
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteAffrows()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, insert.AppendData(items.First()).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(10, insert.AppendData(items).ExecuteAffrows());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteIdentity()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteInserted()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //var items = new List<Topic>();
 | 
				
			||||||
 | 
					            //for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //var items2 = insert.AppendData(items).ExecuteInserted();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AsTable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql = insert.AppendData(items.First()).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal("INSERT INTO \"TOPIC_INSERTASTABLE\"(\"CLICKS\", \"TITLE\", \"CREATETIME\") VALUES(0, 'newTitle0', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(0, 'newTitle0', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(100, 'newTitle1', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(200, 'newTitle2', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(300, 'newTitle3', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(400, 'newTitle4', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(500, 'newTitle5', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(600, 'newTitle6', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(700, 'newTitle7', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(800, 'newTitle8', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") VALUES(900, 'newTitle9', to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).IgnoreColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(0, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(100, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(200, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(300, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(400, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(500, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(600, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(700, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(800, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""CREATETIME"") VALUES(900, to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle0')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle1')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle2')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle3')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle4')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle5')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle6')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle7')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle8')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).InsertColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle0')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle1')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle2')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle3')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle4')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle5')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle6')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle7')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle8')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""TITLE"") VALUES('newTitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).AsTable(a => "Topic_InsertAsTable").ToSql();
 | 
				
			||||||
 | 
					            Assert.Equal(@"INSERT ALL
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(0, 'newTitle0')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(100, 'newTitle1')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(200, 'newTitle2')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(300, 'newTitle3')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(400, 'newTitle4')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(500, 'newTitle5')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(600, 'newTitle6')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(700, 'newTitle7')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(800, 'newTitle8')
 | 
				
			||||||
 | 
					INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") VALUES(900, 'newTitle9')
 | 
				
			||||||
 | 
					 SELECT 1 FROM DUAL", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1788
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1788
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										173
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,173 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengUpdateTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        IUpdate<Topic> update => g.dameng.Update<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int? Clicks { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Dywhere()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Assert.Null(g.dameng.Update<Topic>().ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.dameng.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.dameng.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test1' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.dameng.Update<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("title='test1'").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.dameng.Update<Topic>(new { id = 1 }).SetRaw("title='test1'").ToSql());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void SetSource()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = NULL, \"TITLE\" = 'newtitle', \"CREATETIME\" = to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
 | 
				
			||||||
 | 
					            items[0].Clicks = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.SetSource(items).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = CASE \"ID\" WHEN 1 THEN NULL WHEN 2 THEN 100 WHEN 3 THEN 200 WHEN 4 THEN 300 WHEN 5 THEN 400 WHEN 6 THEN 500 WHEN 7 THEN 600 WHEN 8 THEN 700 WHEN 9 THEN 800 WHEN 10 THEN 900 END, \"TITLE\" = CASE \"ID\" WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END, \"CREATETIME\" = CASE \"ID\" WHEN 1 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 2 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 3 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 4 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 5 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 6 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 7 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 8 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 9 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHEN 10 THEN to_timestamp('0001-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') END WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = CASE \"ID\" WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CREATETIME\" = to_timestamp('2020-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (g.dameng.Select<ts_source_mpk>().Where(a => a.id1 == 1 && a.id2 == 7).Any() == false)
 | 
				
			||||||
 | 
					                g.dameng.Insert(new ts_source_mpk { id1 = 1, id2 = 7 }).ExecuteAffrows();
 | 
				
			||||||
 | 
					            if (g.dameng.Select<ts_source_mpk>().Where(a => a.id1 == 1 && a.id2 == 8).Any() == false)
 | 
				
			||||||
 | 
					                g.dameng.Insert(new ts_source_mpk { id1 = 1, id2 = 8 }).ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = g.dameng.Update<ts_source_mpk>().SetSource(new[] {
 | 
				
			||||||
 | 
					                new ts_source_mpk { id1 = 1, id2 = 7, xx = "a1" },
 | 
				
			||||||
 | 
					                new ts_source_mpk { id1 = 1, id2 = 8, xx = "b122" }
 | 
				
			||||||
 | 
					            }).NoneParameter().ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            g.dameng.Update<ts_source_mpk>().SetSource(new[] {
 | 
				
			||||||
 | 
					                new ts_source_mpk { id1 = 1, id2 = 7, xx = "a1" },
 | 
				
			||||||
 | 
					                new ts_source_mpk { id1 = 1, id2 = 8, xx = "b122" }
 | 
				
			||||||
 | 
					            }).NoneParameter().ExecuteAffrows();
 | 
				
			||||||
 | 
					            var testlist = g.dameng.Select<ts_source_mpk>().ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public class ts_source_mpk
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int id1 { get; set; }
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int id2 { get; set; }
 | 
				
			||||||
 | 
					            public string xx { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void IgnoreColumns()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = 'newtitle' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void UpdateColumns()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = 'newtitle' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Set()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = 'newtitle' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"TITLE\" = 'newtitle', \"CREATETIME\" = to_timestamp('2020-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = trunc(nvl(\"CLICKS\", 0) * 10 / 1) WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Id - 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = (\"ID\" - 10) WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            int incrv = 10;
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Clicks * incrv / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = trunc(nvl(\"CLICKS\", 0) * 10 / 1) WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Id - incrv).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = (\"ID\" - 10) WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Clicks == a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = trunc(\"CLICKS\" * 10 / 1) WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var dt2000 = DateTime.Parse("2000-01-01");
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Clicks == (a.CreateTime > dt2000 ? 1 : 2)).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = case when \"CREATETIME\" > to_timestamp('2000-01-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') then 1 else 2 end WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void SetRaw()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + ?", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET clicks = clicks + ? WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void SetDto()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.SetDto(new { clicks = 1, title = "xxx" }).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = 1, \"TITLE\" = 'xxx' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.SetDto(new Dictionary<string, object> { ["clicks"] = 1, ["title"] = "xxx" }).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = 1, \"TITLE\" = 'xxx' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Where()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = update.Where(a => a.Id == 1).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = update.Where("id = ?", new { id = 1 }).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (id = ?)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item = new Topic { Id = 1, Title = "newtitle" };
 | 
				
			||||||
 | 
					            sql = update.Where(item).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (\"ID\" = 1)", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var items = new List<Topic>();
 | 
				
			||||||
 | 
					            for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
 | 
				
			||||||
 | 
					            sql = update.Where(items).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPIC\" SET title='newtitle' WHERE (\"ID\" IN (1,2,3,4,5,6,7,8,9,10))", sql);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteAffrows()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteUpdated()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AsTable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Assert.Null(g.dameng.Update<Topic>().ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPICASTABLE\" SET title='test' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.dameng.Update<Topic>(new[] { 1, 2 }).SetRaw("title='test'").AsTable(a => "tb_topicAsTable").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPICASTABLE\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.dameng.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPICASTABLE\" SET title='test1' \r\nWHERE (\"ID\" = 1 OR \"ID\" = 2)", g.dameng.Update<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
 | 
				
			||||||
 | 
					            Assert.Equal("UPDATE \"TB_TOPICASTABLE\" SET title='test1' \r\nWHERE (\"ID\" = 1)", g.dameng.Update<Topic>(new { id = 1 }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengAdoTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Pool()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var t1 = g.dameng.Ado.MasterPool.StatisticsFullily;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void SlavePools()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var t2 = g.dameng.Ado.SlavePools.Count;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteReader()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteArray()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteNonQuery()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ExecuteScalar()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Query()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t3 = g.dameng.Ado.Query<xxx>("select * from \"TB_TOPIC\"");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t4 = g.dameng.Ado.Query<(int, string, string)>("select * from \"TB_TOPIC\"");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t5 = g.dameng.Ado.Query<dynamic>("select * from \"TB_TOPIC\"");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void QueryMultipline()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //var t3 = g.dameng.Ado.Query<xxx, (int, string, string), dynamic>("select * from \"TB_TOPIC\"; select * from \"TB_TOPIC\"; select * from \"TB_TOPIC\"");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class xxx
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Path { get; set; }
 | 
				
			||||||
 | 
					            public string Title2 { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengAopTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengAopTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Reflection;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengAopTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class TestAuditValue
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					            [Now]
 | 
				
			||||||
 | 
					            public DateTime createtime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class NowAttribute: Attribute { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AuditValue()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var date = DateTime.Now.Date;
 | 
				
			||||||
 | 
					            var item = new TestAuditValue();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            EventHandler<Aop.AuditValueEventArgs> audit = (s, e) =>
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 if (e.Property.GetCustomAttribute<NowAttribute>(false) != null)
 | 
				
			||||||
 | 
					                     e.Value = DateTime.Now.Date;
 | 
				
			||||||
 | 
					             };
 | 
				
			||||||
 | 
					            g.dameng.Aop.AuditValue += audit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.dameng.Insert(item).ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g.dameng.Aop.AuditValue -= audit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(item.createtime, date);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										352
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,352 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using Newtonsoft.Json;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengCodeFirstTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void StringLength()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var dll = g.dameng.CodeFirst.GetComparisonDDLStatements<TS_SLTB>();
 | 
				
			||||||
 | 
					            g.dameng.CodeFirst.SyncStructure<TS_SLTB>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TS_SLTB
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid Id { get; set; }
 | 
				
			||||||
 | 
					            [Column(StringLength = 50)]
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(IsNullable = false, StringLength = 50)]
 | 
				
			||||||
 | 
					            public string TitleSub { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void <EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>_<EFBFBD>ֶ<EFBFBD>()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = g.dameng.CodeFirst.GetComparisonDDLStatements<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>();
 | 
				
			||||||
 | 
					            g.dameng.CodeFirst.SyncStructure<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item = new <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>",
 | 
				
			||||||
 | 
					                <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> = DateTime.Now
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            Assert.Equal(1, g.dameng.Insert<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.NotEqual(Guid.Empty, item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            var item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
 | 
				
			||||||
 | 
					            Assert.Equal(1, g.dameng.Update<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_repo";
 | 
				
			||||||
 | 
					            var repo = g.dameng.GetRepository<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>();
 | 
				
			||||||
 | 
					            Assert.Equal(1, repo.Update(item));
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_repo22";
 | 
				
			||||||
 | 
					            Assert.Equal(1, repo.Update(item));
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Table(Name = "123<32><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>")]
 | 
				
			||||||
 | 
					        class <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true, Name = "123<32><33><EFBFBD><EFBFBD>")]
 | 
				
			||||||
 | 
					            public Guid <EFBFBD><EFBFBD><EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(Name = "123<32><33><EFBFBD><EFBFBD>")]
 | 
				
			||||||
 | 
					            public string <EFBFBD><EFBFBD><EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(Name = "123<32><33><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>")]
 | 
				
			||||||
 | 
					            public DateTime <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void <EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>_<EFBFBD>ֶ<EFBFBD>()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = g.dameng.CodeFirst.GetComparisonDDLStatements<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>();
 | 
				
			||||||
 | 
					            g.dameng.CodeFirst.SyncStructure<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item = new <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                <EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>",
 | 
				
			||||||
 | 
					                <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> = DateTime.Now
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            Assert.Equal(1, g.dameng.Insert<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.NotEqual(Guid.Empty, item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            var item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
 | 
				
			||||||
 | 
					            Assert.Equal(1, g.dameng.Update<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_repo";
 | 
				
			||||||
 | 
					            var repo = g.dameng.GetRepository<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>();
 | 
				
			||||||
 | 
					            Assert.Equal(1, repo.Update(item));
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> = "<22><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_repo22";
 | 
				
			||||||
 | 
					            Assert.Equal(1, repo.Update(item));
 | 
				
			||||||
 | 
					            item2 = g.dameng.Select<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>>().Where(a => a.<EFBFBD><EFBFBD><EFBFBD><EFBFBD> == item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					            Assert.Equal(item.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, item2.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsPrimary = true)]
 | 
				
			||||||
 | 
					            public Guid <EFBFBD><EFBFBD><EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string <EFBFBD><EFBFBD><EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public DateTime <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddUniques()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = g.dameng.CodeFirst.GetComparisonDDLStatements<AddUniquesInfo>();
 | 
				
			||||||
 | 
					            g.dameng.CodeFirst.SyncStructure<AddUniquesInfo>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")]
 | 
				
			||||||
 | 
					        [Index("uk_phone", "phone", true)]
 | 
				
			||||||
 | 
					        [Index("uk_group_index", "group,index", true)]
 | 
				
			||||||
 | 
					        [Index("uk_group_index22", "group, index22", true)]
 | 
				
			||||||
 | 
					        class AddUniquesInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					            public string phone { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string group { get; set; }
 | 
				
			||||||
 | 
					            public int index { get; set; }
 | 
				
			||||||
 | 
					            public string index22 { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddField()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = g.dameng.CodeFirst.GetComparisonDDLStatements<TopicAddField>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var id = g.dameng.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteIdentity();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //var inserted = g.dameng.Insert<TopicAddField>().AppendData(new TopicAddField { }).ExecuteInserted();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "TopicAddField", OldName = "xxxtb.TopicAddField")]
 | 
				
			||||||
 | 
					        public class TopicAddField
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(DbType = "varchar2(200) not null", OldName = "title")]
 | 
				
			||||||
 | 
					            public string title2 { get; set; } = "10";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(IsIgnore = true)]
 | 
				
			||||||
 | 
					            public DateTime ct { get; set; } = DateTime.Now;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetComparisonDDLStatements()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql = g.dameng.CodeFirst.GetComparisonDDLStatements<TableAllType>();
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(sql) == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Assert.Equal(@"CREATE TABLE IF NOT EXISTS `cccddd`.`tb_alltype` ( 
 | 
				
			||||||
 | 
					  `Id` INT(11) NOT NULL AUTO_INCREMENT, 
 | 
				
			||||||
 | 
					  `Bool` BIT(1) NOT NULL, 
 | 
				
			||||||
 | 
					  `SByte` TINYINT(3) NOT NULL, 
 | 
				
			||||||
 | 
					  `Short` SMALLINT(6) NOT NULL, 
 | 
				
			||||||
 | 
					  `Int` INT(11) NOT NULL, 
 | 
				
			||||||
 | 
					  `Long` BIGINT(20) NOT NULL, 
 | 
				
			||||||
 | 
					  `Byte` TINYINT(3) UNSIGNED NOT NULL, 
 | 
				
			||||||
 | 
					  `UShort` SMALLINT(5) UNSIGNED NOT NULL, 
 | 
				
			||||||
 | 
					  `UInt` INT(10) UNSIGNED NOT NULL, 
 | 
				
			||||||
 | 
					  `ULong` BIGINT(20) UNSIGNED NOT NULL, 
 | 
				
			||||||
 | 
					  `Double` DOUBLE NOT NULL, 
 | 
				
			||||||
 | 
					  `Float` FLOAT NOT NULL, 
 | 
				
			||||||
 | 
					  `Decimal` DECIMAL(10,2) NOT NULL, 
 | 
				
			||||||
 | 
					  `TimeSpan` TIME NOT NULL, 
 | 
				
			||||||
 | 
					  `DateTime` DATETIME NOT NULL, 
 | 
				
			||||||
 | 
					  `Bytes` VARBINARY(255), 
 | 
				
			||||||
 | 
					  `String` VARCHAR(255), 
 | 
				
			||||||
 | 
					  `Guid` VARCHAR(36), 
 | 
				
			||||||
 | 
					  `BoolNullable` BIT(1), 
 | 
				
			||||||
 | 
					  `SByteNullable` TINYINT(3), 
 | 
				
			||||||
 | 
					  `ShortNullable` SMALLINT(6), 
 | 
				
			||||||
 | 
					  `IntNullable` INT(11), 
 | 
				
			||||||
 | 
					  `testFielLongNullable` BIGINT(20), 
 | 
				
			||||||
 | 
					  `ByteNullable` TINYINT(3) UNSIGNED, 
 | 
				
			||||||
 | 
					  `UShortNullable` SMALLINT(5) UNSIGNED, 
 | 
				
			||||||
 | 
					  `UIntNullable` INT(10) UNSIGNED, 
 | 
				
			||||||
 | 
					  `ULongNullable` BIGINT(20) UNSIGNED, 
 | 
				
			||||||
 | 
					  `DoubleNullable` DOUBLE, 
 | 
				
			||||||
 | 
					  `FloatNullable` FLOAT, 
 | 
				
			||||||
 | 
					  `DecimalNullable` DECIMAL(10,2), 
 | 
				
			||||||
 | 
					  `TimeSpanNullable` TIME, 
 | 
				
			||||||
 | 
					  `DateTimeNullable` DATETIME, 
 | 
				
			||||||
 | 
					  `GuidNullable` VARCHAR(36), 
 | 
				
			||||||
 | 
					  `Point` POINT, 
 | 
				
			||||||
 | 
					  `LineString` LINESTRING, 
 | 
				
			||||||
 | 
					  `Polygon` POLYGON, 
 | 
				
			||||||
 | 
					  `MultiPoint` MULTIPOINT, 
 | 
				
			||||||
 | 
					  `MultiLineString` MULTILINESTRING, 
 | 
				
			||||||
 | 
					  `MultiPolygon` MULTIPOLYGON, 
 | 
				
			||||||
 | 
					  `Enum1` ENUM('E1','E2','E3') NOT NULL, 
 | 
				
			||||||
 | 
					  `Enum1Nullable` ENUM('E1','E2','E3'), 
 | 
				
			||||||
 | 
					  `Enum2` SET('F1','F2','F3') NOT NULL, 
 | 
				
			||||||
 | 
					  `Enum2Nullable` SET('F1','F2','F3'), 
 | 
				
			||||||
 | 
					  PRIMARY KEY (`Id`)
 | 
				
			||||||
 | 
					) Engine=InnoDB;
 | 
				
			||||||
 | 
					", sql);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //sql = g.dameng.CodeFirst.GetComparisonDDLStatements<Tb_alltype>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IInsert<TableAllType> insert => g.dameng.Insert<TableAllType>();
 | 
				
			||||||
 | 
					        ISelect<TableAllType> select => g.dameng.Select<TableAllType>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void CurdAllField()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = new TableAllType { };
 | 
				
			||||||
 | 
					            item.Id = (int)insert.AppendData(item).ExecuteIdentity();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var newitem = select.Where(a => a.Id == item.Id).ToOne();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = new TableAllType
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Bool = true,
 | 
				
			||||||
 | 
					                BoolNullable = true,
 | 
				
			||||||
 | 
					                Byte = 255,
 | 
				
			||||||
 | 
					                ByteNullable = 127,
 | 
				
			||||||
 | 
					                Bytes = Encoding.UTF8.GetBytes("<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>"),
 | 
				
			||||||
 | 
					                DateTime = DateTime.Now,
 | 
				
			||||||
 | 
					                DateTimeNullable = DateTime.Now.AddHours(-1),
 | 
				
			||||||
 | 
					                Decimal = 99.99M,
 | 
				
			||||||
 | 
					                DecimalNullable = 99.98M,
 | 
				
			||||||
 | 
					                Double = 999.99,
 | 
				
			||||||
 | 
					                DoubleNullable = 999.98,
 | 
				
			||||||
 | 
					                Enum1 = TableAllTypeEnumType1.e5,
 | 
				
			||||||
 | 
					                Enum1Nullable = TableAllTypeEnumType1.e3,
 | 
				
			||||||
 | 
					                Enum2 = TableAllTypeEnumType2.f2,
 | 
				
			||||||
 | 
					                Enum2Nullable = TableAllTypeEnumType2.f3,
 | 
				
			||||||
 | 
					                Float = 19.99F,
 | 
				
			||||||
 | 
					                FloatNullable = 19.98F,
 | 
				
			||||||
 | 
					                Guid = Guid.NewGuid(),
 | 
				
			||||||
 | 
					                GuidNullable = Guid.NewGuid(),
 | 
				
			||||||
 | 
					                Int = int.MaxValue,
 | 
				
			||||||
 | 
					                IntNullable = int.MinValue,
 | 
				
			||||||
 | 
					                SByte = 100,
 | 
				
			||||||
 | 
					                SByteNullable = 99,
 | 
				
			||||||
 | 
					                Short = short.MaxValue,
 | 
				
			||||||
 | 
					                ShortNullable = short.MinValue,
 | 
				
			||||||
 | 
					                String = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>string'\\?!@#$%^&*()_+{}}{~?><<>",
 | 
				
			||||||
 | 
					                TimeSpan = TimeSpan.FromSeconds(999),
 | 
				
			||||||
 | 
					                TimeSpanNullable = TimeSpan.FromSeconds(60),
 | 
				
			||||||
 | 
					                UInt = uint.MaxValue,
 | 
				
			||||||
 | 
					                UIntNullable = uint.MinValue,
 | 
				
			||||||
 | 
					                ULong = ulong.MaxValue,
 | 
				
			||||||
 | 
					                ULongNullable = ulong.MinValue,
 | 
				
			||||||
 | 
					                UShort = ushort.MaxValue,
 | 
				
			||||||
 | 
					                UShortNullable = ushort.MinValue,
 | 
				
			||||||
 | 
					                testFielLongNullable = long.MinValue
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            var sqlPar = insert.AppendData(item2).ToSql();
 | 
				
			||||||
 | 
					            var sqlText = insert.AppendData(item2).NoneParameter().ToSql();
 | 
				
			||||||
 | 
					            var item3NP = insert.AppendData(item2).NoneParameter().ExecuteIdentity();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item2.Id = (int)insert.AppendData(item2).ExecuteIdentity();
 | 
				
			||||||
 | 
					            var newitem2 = select.Where(a => a.Id == item2.Id).ToOne();
 | 
				
			||||||
 | 
					            Assert.Equal(item2.String, newitem2.String);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item2.Id = (int)insert.NoneParameter().AppendData(item2).ExecuteIdentity();
 | 
				
			||||||
 | 
					            newitem2 = select.Where(a => a.Id == item2.Id).ToOne();
 | 
				
			||||||
 | 
					            Assert.Equal(item2.String, newitem2.String);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var items = select.ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_alltype")]
 | 
				
			||||||
 | 
					        class TableAllType
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string id2 { get; set; } = "id2=10";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public bool Bool { get; set; }
 | 
				
			||||||
 | 
					            public sbyte SByte { get; set; }
 | 
				
			||||||
 | 
					            public short Short { get; set; }
 | 
				
			||||||
 | 
					            public int Int { get; set; }
 | 
				
			||||||
 | 
					            public long Long { get; set; }
 | 
				
			||||||
 | 
					            public byte Byte { get; set; }
 | 
				
			||||||
 | 
					            public ushort UShort { get; set; }
 | 
				
			||||||
 | 
					            public uint UInt { get; set; }
 | 
				
			||||||
 | 
					            public ulong ULong { get; set; }
 | 
				
			||||||
 | 
					            public double Double { get; set; }
 | 
				
			||||||
 | 
					            public float Float { get; set; }
 | 
				
			||||||
 | 
					            public decimal Decimal { get; set; }
 | 
				
			||||||
 | 
					            public TimeSpan TimeSpan { get; set; }
 | 
				
			||||||
 | 
					            public DateTime DateTime { get; set; }
 | 
				
			||||||
 | 
					            public DateTime DateTimeOffSet { get; set; }
 | 
				
			||||||
 | 
					            public byte[] Bytes { get; set; }
 | 
				
			||||||
 | 
					            public string String { get; set; }
 | 
				
			||||||
 | 
					            public Guid Guid { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public bool? BoolNullable { get; set; }
 | 
				
			||||||
 | 
					            public sbyte? SByteNullable { get; set; }
 | 
				
			||||||
 | 
					            public short? ShortNullable { get; set; }
 | 
				
			||||||
 | 
					            public int? IntNullable { get; set; }
 | 
				
			||||||
 | 
					            public long? testFielLongNullable { get; set; }
 | 
				
			||||||
 | 
					            public byte? ByteNullable { get; set; }
 | 
				
			||||||
 | 
					            public ushort? UShortNullable { get; set; }
 | 
				
			||||||
 | 
					            public uint? UIntNullable { get; set; }
 | 
				
			||||||
 | 
					            public ulong? ULongNullable { get; set; }
 | 
				
			||||||
 | 
					            public double? DoubleNullable { get; set; }
 | 
				
			||||||
 | 
					            public float? FloatNullable { get; set; }
 | 
				
			||||||
 | 
					            public decimal? DecimalNullable { get; set; }
 | 
				
			||||||
 | 
					            public TimeSpan? TimeSpanNullable { get; set; }
 | 
				
			||||||
 | 
					            public DateTime? DateTimeNullable { get; set; }
 | 
				
			||||||
 | 
					            public DateTime? DateTimeOffSetNullable { get; set; }
 | 
				
			||||||
 | 
					            public Guid? GuidNullable { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType1 Enum1 { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType1? Enum1Nullable { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType2 Enum2 { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType2? Enum2Nullable { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public enum TableAllTypeEnumType1 { e1, e2, e3, e5 }
 | 
				
			||||||
 | 
					        [Flags] public enum TableAllTypeEnumType2 { f1, f2, f3 }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DamengDbFirstTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetDatabases()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t1 = g.dameng.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t2 = g.dameng.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,169 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class ConvertTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<Topic> select => g.dameng.Select<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public int TypeGuid { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Guid { get; set; }
 | 
				
			||||||
 | 
					            public int ParentId { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeParentInfo Parent { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeParentInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public List<TestTypeInfo> Types { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToBoolean()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            //data.Add(select.Where(a => (Convert.ToBoolean(a.Clicks) ? 1 : 0) > 0).ToList());
 | 
				
			||||||
 | 
					            //data.Add(select.Where(a => (bool.Parse(a.Clicks.ToString()) ? 1 : 0) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToByte()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToByte(a.Clicks % 255) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => byte.Parse((a.Clicks % 255).ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToChar()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToChar(a.Clicks) == '1').ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => char.Parse(a.Clicks.ToString()) == '1').ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToDateTime()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToDateTime(a.CreateTime.ToString()).Year > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()).Year > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToDecimal()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToDecimal(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => decimal.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToDouble()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToDouble(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => double.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToInt16()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToInt16(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => short.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToInt32()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (int)a.Clicks > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToInt32(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => int.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToInt64()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToInt64(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => long.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToSByte()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToSByte(a.Clicks % 128) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => sbyte.Parse((a.Clicks % 128).ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToSingle()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToSingle(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => float.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void this_ToString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToString(a.Clicks).Equals("")).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Clicks.ToString().Equals("")).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToUInt16()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToUInt16(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => ushort.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToUInt32()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToUInt32(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => uint.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToUInt64()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Convert.ToUInt64(a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => ulong.Parse(a.Clicks.ToString()) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Guid_Parse()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Guid.Parse(Guid.Empty.ToString()) == Guid.Empty).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Guid_NewGuid()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            //data.Add(select.OrderBy(a => Guid.NewGuid()).Limit(10).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Random()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,706 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DateTimeTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<Topic> select => g.dameng.Select<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic111333")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public int TypeGuid { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Table(Name = "TestTypeInfo333")]
 | 
				
			||||||
 | 
					        class TestTypeInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true)]
 | 
				
			||||||
 | 
					            public int Guid { get; set; }
 | 
				
			||||||
 | 
					            public int ParentId { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeParentInfo Parent { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					            public DateTime Time { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Table(Name = "TestTypeParentInf1")]
 | 
				
			||||||
 | 
					        class TestTypeParentInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public List<TestTypeInfo> Types { get; set; }
 | 
				
			||||||
 | 
					            public DateTime Time2 { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Now()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(now(), '%Y-%m-%d') as datetime))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void UtcNow()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Date == DateTime.UtcNow.Date).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(utc_timestamp(), '%Y-%m-%d') as datetime))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void MinValue()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Date == DateTime.MinValue.Date).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('0001/1/1 0:00:00' as datetime), '%Y-%m-%d') as datetime))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void MaxValue()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Date == DateTime.MaxValue.Date).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(cast('9999/12/31 23:59:59' as datetime), '%Y-%m-%d') as datetime))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Date()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Date == DateTime.Now.Date).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Date > DateTime.Now.Date).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Date > DateTime.Now.Date).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime) = cast(date_format(now(), '%Y-%m-%d') as datetime));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a__Type.`Time`, '%Y-%m-%d') as datetime) > cast(date_format(now(), '%Y-%m-%d') as datetime));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a__Type__Parent.`Time2`, '%Y-%m-%d') as datetime) > cast(date_format(now(), '%Y-%m-%d') as datetime));
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Now.Subtract(a.CreateTime.Date).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Now.Subtract(a.Type.Time.Date).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Now.Subtract(a.Type.Parent.Time2.Date).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, cast(date_format(a.`CreateTime`, '%Y-%m-%d') as datetime), now())) / 1000000) > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, cast(date_format(a__Type.`Time`, '%Y-%m-%d') as datetime), now())) / 1000000) > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, cast(date_format(a__Type__Parent.`Time2`, '%Y-%m-%d') as datetime), now())) / 1000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeOfDay()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay == DateTime.Now.TimeOfDay).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.TimeOfDay > DateTime.Now.TimeOfDay).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.TimeOfDay > DateTime.Now.TimeOfDay).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (timestampdiff(microsecond, date_format(now(), '1970-1-1 %H:%i:%s.%f'), now()) + 62135596800000000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a__Type.`Time`, '1970-1-1 %H:%i:%s.%f'), a__Type.`Time`) + 62135596800000000) > (timestampdiff(microsecond, date_format(now(), '1970-1-1 %H:%i:%s.%f'), now()) + 62135596800000000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a__Type__Parent.`Time2`, '1970-1-1 %H:%i:%s.%f'), a__Type__Parent.`Time2`) + 62135596800000000) > (timestampdiff(microsecond, date_format(now(), '1970-1-1 %H:%i:%s.%f'), now()) + 62135596800000000))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DayOfWeek()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.DayOfWeek > DateTime.Now.DayOfWeek).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((dayofweek(a.`CreateTime`) - 1) > (dayofweek(now()) - 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((dayofweek(a__Type.`Time`) - 1) > (dayofweek(now()) - 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((dayofweek(a__Type__Parent.`Time2`) - 1) > (dayofweek(now()) - 1))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Day()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Day > DateTime.Now.Day).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Day > DateTime.Now.Day).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Day > DateTime.Now.Day).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(a.`CreateTime`) > dayofmonth(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(a__Type.`Time`) > dayofmonth(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(a__Type__Parent.`Time2`) > dayofmonth(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DayOfYear()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.DayOfYear > DateTime.Now.DayOfYear).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.DayOfYear > DateTime.Now.DayOfYear).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.DayOfYear > DateTime.Now.DayOfYear).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (dayofyear(a.`CreateTime`) > dayofyear(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (dayofyear(a__Type.`Time`) > dayofyear(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (dayofyear(a__Type__Parent.`Time2`) > dayofyear(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Month()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Month > DateTime.Now.Month).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Month > DateTime.Now.Month).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Month > DateTime.Now.Month).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (month(a.`CreateTime`) > month(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (month(a__Type.`Time`) > month(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (month(a__Type__Parent.`Time2`) > month(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Year()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Year > DateTime.Now.Year).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Year > DateTime.Now.Year).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Year > DateTime.Now.Year).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (year(a.`CreateTime`) > year(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (year(a__Type.`Time`) > year(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (year(a__Type__Parent.`Time2`) > year(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Hour()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Hour > DateTime.Now.Hour).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Hour > DateTime.Now.Hour).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Hour > DateTime.Now.Hour).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (hour(a.`CreateTime`) > hour(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (hour(a__Type.`Time`) > hour(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (hour(a__Type__Parent.`Time2`) > hour(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Minute()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Minute > DateTime.Now.Minute).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Minute > DateTime.Now.Minute).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Minute > DateTime.Now.Minute).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (minute(a.`CreateTime`) > minute(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (minute(a__Type.`Time`) > minute(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (minute(a__Type__Parent.`Time2`) > minute(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Second()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Second > DateTime.Now.Second).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Second > DateTime.Now.Second).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Second > DateTime.Now.Second).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (second(a.`CreateTime`) > second(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (second(a__Type.`Time`) > second(now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (second(a__Type__Parent.`Time2`) > second(now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Millisecond()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Millisecond > DateTime.Now.Millisecond).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Millisecond > DateTime.Now.Millisecond).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Millisecond > DateTime.Now.Millisecond).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (floor(microsecond(a.`CreateTime`) / 1000) > floor(microsecond(now()) / 1000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (floor(microsecond(a__Type.`Time`) / 1000) > floor(microsecond(now()) / 1000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (floor(microsecond(a__Type__Parent.`Time2`) / 1000) > floor(microsecond(now()) / 1000))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Ticks()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Ticks > DateTime.Now.Ticks).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Ticks > DateTime.Now.Ticks).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Ticks > DateTime.Now.Ticks).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, '1970-1-1', a.`CreateTime`) * 10 + 621355968000000000) > (timestampdiff(microsecond, '1970-1-1', now()) * 10 + 621355968000000000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, '1970-1-1', a__Type.`Time`) * 10 + 621355968000000000) > (timestampdiff(microsecond, '1970-1-1', now()) * 10 + 621355968000000000));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, '1970-1-1', a__Type__Parent.`Time2`) * 10 + 621355968000000000) > (timestampdiff(microsecond, '1970-1-1', now()) * 10 + 621355968000000000))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Add()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Add(TimeSpan.FromDays(1)) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval ((1 * 86400000000)) microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval ((1 * 86400000000)) microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval ((1 * 86400000000)) microsecond) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddDays()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddDays(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddDays(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddDays(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) day) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) day) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) day) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddHours()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddHours(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddHours(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddHours(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) hour) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) hour) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) hour) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddMilliseconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddMilliseconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddMilliseconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddMilliseconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) * 1000 microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) * 1000 microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) * 1000 microsecond) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddMinutes()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddMinutes(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddMinutes(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddMinutes(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) minute) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) minute) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) minute) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddMonths()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddMonths(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddMonths(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddMonths(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) month) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) month) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) month) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddSeconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddSeconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddSeconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddSeconds(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) second) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) second) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) second) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddTicks()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddTicks(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddTicks(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddTicks(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) / 10 microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) / 10 microsecond) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) / 10 microsecond) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void AddYears()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddYears(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddYears(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a.`CreateTime`, interval (1) year) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type.`Time`, interval (1) year) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (date_add(a__Type__Parent.`Time2`, interval (1) year) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Subtract()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Subtract(DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a."CREATETIME"))*86400+extract(hour from (systimestamp-a."CREATETIME"))*3600+extract(minute from (systimestamp-a."CREATETIME"))*60+extract(second from (systimestamp-a."CREATETIME"))) > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a__Type."TIME"))*86400+extract(hour from (systimestamp-a__Type."TIME"))*3600+extract(minute from (systimestamp-a__Type."TIME"))*60+extract(second from (systimestamp-a__Type."TIME"))) > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEPARENTINF1" a__Type__Parent ON a__Type__Parent."ID" = a__Type."PARENTID" 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a__Type__Parent."TIME2"))*86400+extract(hour from (systimestamp-a__Type__Parent."TIME2"))*3600+extract(minute from (systimestamp-a__Type__Parent."TIME2"))*60+extract(second from (systimestamp-a__Type__Parent."TIME2"))) > 0)
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.Subtract(TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.Subtract(TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.Subtract(TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //WHERE ((a."CREATETIME"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //WHERE ((a__Type."TIME"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEPARENTINF1" a__Type__Parent ON a__Type__Parent."ID" = a__Type."PARENTID" 
 | 
				
			||||||
 | 
					            //WHERE ((a__Type__Parent."TIME2"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_Ч<EFBFBD><EFBFBD>ͬSubtract()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.CreateTime - DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Type.Time - DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Type.Parent.Time2 - DateTime.Now).TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a."CREATETIME"))*86400+extract(hour from (systimestamp-a."CREATETIME"))*3600+extract(minute from (systimestamp-a."CREATETIME"))*60+extract(second from (systimestamp-a."CREATETIME"))) > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a__Type."TIME"))*86400+extract(hour from (systimestamp-a__Type."TIME"))*3600+extract(minute from (systimestamp-a__Type."TIME"))*60+extract(second from (systimestamp-a__Type."TIME"))) > 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEPARENTINF1" a__Type__Parent ON a__Type__Parent."ID" = a__Type."PARENTID" 
 | 
				
			||||||
 | 
					            //WHERE ((extract(day from (systimestamp-a__Type__Parent."TIME2"))*86400+extract(hour from (systimestamp-a__Type__Parent."TIME2"))*3600+extract(minute from (systimestamp-a__Type__Parent."TIME2"))*60+extract(second from (systimestamp-a__Type__Parent."TIME2"))) > 0)
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.CreateTime - TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Type.Time - TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Type.Parent.Time2 - TimeSpan.FromDays(1)) > a.CreateTime).ToList());
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //WHERE ((a."CREATETIME"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //WHERE ((a__Type."TIME"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					            //SELECT a."ID", a."CLICKS", a."TYPEGUID", a__Type."GUID", a__Type."PARENTID", a__Type."NAME", a__Type."TIME", a."TITLE", a."CREATETIME" 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //FROM "TB_TOPIC111333" a 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEINFO333" a__Type ON a__Type."GUID" = a."TYPEGUID" 
 | 
				
			||||||
 | 
					            //LEFT JOIN "TESTTYPEPARENTINF1" a__Type__Parent ON a__Type__Parent."ID" = a__Type."PARENTID" 
 | 
				
			||||||
 | 
					            //WHERE ((a__Type__Parent."TIME2"-numtodsinterval((1)*86400,'second')) > a."CREATETIME")
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void this_Equals()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.AddYears(1).Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddYears(1).Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1).Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a.`CreateTime`, interval (1) year) = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a__Type.`Time`, interval (1) year) = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void this_ToString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.ToString().Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddYears(1).ToString().Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1).ToString().Equals(DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((date_format(a.`CreateTime`, '%Y-%m-%d %H:%i:%s.%f') = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((date_format(date_add(a__Type.`Time`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((date_format(date_add(a__Type__Parent.`Time2`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') = now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime_Compare()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.CompareTo(DateTime.Now) == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Time.AddYears(1).CompareTo(DateTime.Now) == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Type.Parent.Time2.AddYears(1).CompareTo(DateTime.Now) == 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (((a.`CreateTime`) - (now())) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (((date_add(a__Type.`Time`, interval (1) year)) - (now())) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (((date_add(a__Type__Parent.`Time2`, interval (1) year)) - (now())) = 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime_DaysInMonth()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.DaysInMonth(a.CreateTime.Year, a.CreateTime.Month) > 30).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.DaysInMonth(a.Type.Time.Year, a.Type.Time.Month) > 30).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.DaysInMonth(a.Type.Parent.Time2.Year, a.Type.Parent.Time2.Month) > 30).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(last_day(concat(year(a.`CreateTime`), month(a.`CreateTime`), '-01'))) > 30);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(last_day(concat(year(a__Type.`Time`), month(a__Type.`Time`), '-01'))) > 30);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (dayofmonth(last_day(concat(year(a__Type__Parent.`Time2`), month(a__Type__Parent.`Time2`), '-01'))) > 30)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime_Equals()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Equals(a.CreateTime.AddYears(1), DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Equals(a.Type.Time.AddYears(1), DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Equals(a.Type.Parent.Time2.AddYears(1), DateTime.Now)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a.`CreateTime`, interval (1) year) = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a__Type.`Time`, interval (1) year) = now()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE ((date_add(a__Type__Parent.`Time2`, interval (1) year) = now()))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime_IsLeapYear()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.IsLeapYear(a.CreateTime.Year)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.IsLeapYear(a.Type.Time.AddYears(1).Year)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.IsLeapYear(a.Type.Parent.Time2.AddYears(1).Year)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (((year(a.`CreateTime`)) % 4 = 0 AND (year(a.`CreateTime`)) % 100 <> 0 OR (year(a.`CreateTime`)) % 400 = 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (((year(date_add(a__Type.`Time`, interval (1) year))) % 4 = 0 AND (year(date_add(a__Type.`Time`, interval (1) year))) % 100 <> 0 OR (year(date_add(a__Type.`Time`, interval (1) year))) % 400 = 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (((year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 4 = 0 AND (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 100 <> 0 OR (year(date_add(a__Type__Parent.`Time2`, interval (1) year))) % 400 = 0))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime_Parse()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Parse(a.CreateTime.ToString()) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Parse(a.Type.Time.AddYears(1).ToString()) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => DateTime.Parse(a.Type.Parent.Time2.AddYears(1).ToString()) > DateTime.Now).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(a.`CreateTime`, '%Y-%m-%d %H:%i:%s.%f') as datetime) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(date_add(a__Type.`Time`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') as datetime) > now());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a__Type.`Time` as7, a.`Title` as8, a.`CreateTime` as9 
 | 
				
			||||||
 | 
					            //FROM `tb_topic111333` a, `TestTypeInfo333` a__Type, `TestTypeParentInfo23123` a__Type__Parent 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(date_add(a__Type__Parent.`Time2`, interval (1) year), '%Y-%m-%d %H:%i:%s.%f') as datetime) > now())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										156
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengExpression/MathTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengExpression/MathTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,156 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class MathTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<Topic> select => g.dameng.Select<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public int TypeGuid { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Guid { get; set; }
 | 
				
			||||||
 | 
					            public int ParentId { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeParentInfo Parent { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeParentInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public List<TestTypeInfo> Types { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void PI()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.PI + a.Clicks > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Abs()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Abs(-a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Sign()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Sign(-a.Clicks) > 0).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Floor()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Floor(a.Clicks + 0.5) == a.Clicks).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Ceiling()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Ceiling(a.Clicks + 0.5) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Round()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Round(a.Clicks + 0.5) == a.Clicks).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Round(a.Clicks + 0.5, 1) > a.Clicks).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Exp()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Exp(1) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Log()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Log(a.Clicks + 0.5) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Log10()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Log10(a.Clicks + 0.5) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Pow()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Pow(2, a.Clicks % 5) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Sqrt()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Sqrt(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Cos()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Cos(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Sin()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Sin(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Tan()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Tan(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Acos()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            //data.Add(select.Where(a => Math.Acos(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Asin()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            //data.Add(select.Where(a => Math.Asin(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Atan()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Atan(Math.Pow(2, a.Clicks % 5)) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Atan2()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            //data.Add(select.Where(a => Math.Atan2(2, a.Clicks) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Truncate()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => Math.Truncate(a.Clicks * 1.0 / 3) == a.Clicks + 1).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										165
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengExpression/OtherTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/DamengExpression/OtherTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,165 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class OtherTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<TableAllType> select => g.dameng.Select<TableAllType>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public OtherTest()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Div()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var t1 = select.Where(a => a.Int / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t2 = select.Where(a => a.Long / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t3 = select.Where(a => a.Short / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t4 = select.Where(a => a.Int / 3.0 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t5 = select.Where(a => a.Long / 3.0 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t6 = select.Where(a => a.Short / 3.0 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t7 = select.Where(a => a.Double / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t8 = select.Where(a => a.Decimal / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					            var t9 = select.Where(a => a.Float / 3 > 3).Limit(10).ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Boolean()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var t1 = select.Where(a => a.Bool == true).ToList();
 | 
				
			||||||
 | 
					            var t2 = select.Where(a => a.Bool != true).ToList();
 | 
				
			||||||
 | 
					            var t3 = select.Where(a => a.Bool == false).ToList();
 | 
				
			||||||
 | 
					            var t4 = select.Where(a => !a.Bool).ToList();
 | 
				
			||||||
 | 
					            var t5 = select.Where(a => a.Bool).ToList();
 | 
				
			||||||
 | 
					            var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t11 = select.Where(a => a.BoolNullable == true).ToList();
 | 
				
			||||||
 | 
					            var t22 = select.Where(a => a.BoolNullable != true).ToList();
 | 
				
			||||||
 | 
					            var t33 = select.Where(a => a.BoolNullable == false).ToList();
 | 
				
			||||||
 | 
					            var t44 = select.Where(a => !a.BoolNullable.Value).ToList();
 | 
				
			||||||
 | 
					            var t55 = select.Where(a => a.BoolNullable.Value).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t111 = select.Where(a => a.Bool == true && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t222 = select.Where(a => a.Bool != true && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t333 = select.Where(a => a.Bool == false && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t444 = select.Where(a => !a.Bool && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t555 = select.Where(a => a.Bool && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t1111 = select.Where(a => a.BoolNullable == true && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t2222 = select.Where(a => a.BoolNullable != true && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t3333 = select.Where(a => a.BoolNullable == false && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t4444 = select.Where(a => !a.BoolNullable.Value && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					            var t5555 = select.Where(a => a.BoolNullable.Value && a.Id > 0).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t11111 = select.Where(a => a.Bool == true && a.Id > 0 && a.Bool == true).ToList();
 | 
				
			||||||
 | 
					            var t22222 = select.Where(a => a.Bool != true && a.Id > 0 && a.Bool != true).ToList();
 | 
				
			||||||
 | 
					            var t33333 = select.Where(a => a.Bool == false && a.Id > 0 && a.Bool == false).ToList();
 | 
				
			||||||
 | 
					            var t44444 = select.Where(a => !a.Bool && a.Id > 0 && !a.Bool).ToList();
 | 
				
			||||||
 | 
					            var t55555 = select.Where(a => a.Bool && a.Id > 0 && a.Bool).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var t111111 = select.Where(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true).ToList();
 | 
				
			||||||
 | 
					            var t222222 = select.Where(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true).ToList();
 | 
				
			||||||
 | 
					            var t333333 = select.Where(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false).ToList();
 | 
				
			||||||
 | 
					            var t444444 = select.Where(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value).ToList();
 | 
				
			||||||
 | 
					            var t555555 = select.Where(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value).ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Array()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            IEnumerable<int> testlinqlist = new List<int>(new[] { 1, 2, 3 });
 | 
				
			||||||
 | 
					            var testlinq = select.Where(a => testlinqlist.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //in not in
 | 
				
			||||||
 | 
					            var sql111 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            //var sql112 = select.Where(a => new[] { 1, 2, 3 }.Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql113 = select.Where(a => !new[] { 1, 2, 3 }.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var inarray = new[] { 1, 2, 3 };
 | 
				
			||||||
 | 
					            var sql1111 = select.Where(a => inarray.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            //var sql1122 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql1133 = select.Where(a => !inarray.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //in not in
 | 
				
			||||||
 | 
					            var sql11111 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            //var sql11222 = select.Where(a => new List<int>() { 1, 2, 3 }.Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql11333 = select.Where(a => !new List<int>() { 1, 2, 3 }.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql11111a = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            //var sql11222b = select.Where(a => new List<int>(new[] { 1, 2, 3 }).Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql11333c = select.Where(a => !new List<int>(new[] { 1, 2, 3 }).Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var inarray2 = new List<int>() { 1, 2, 3 };
 | 
				
			||||||
 | 
					            var sql111111 = select.Where(a => inarray.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            //var sql112222 = select.Where(a => inarray.Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql113333 = select.Where(a => !inarray.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var inarray2n = Enumerable.Range(1, 3333).ToArray();
 | 
				
			||||||
 | 
					            var sql1111111 = select.Where(a => inarray2n.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					            var sql1122222 = select.Where(a => inarray2n.Contains(a.Int) == false).ToList();
 | 
				
			||||||
 | 
					            var sql1133333 = select.Where(a => !inarray2n.Contains(a.Int)).ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_alltype")]
 | 
				
			||||||
 | 
					        class TableAllType
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public string id2 { get; set; } = "id2=10";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public bool Bool { get; set; }
 | 
				
			||||||
 | 
					            public sbyte SByte { get; set; }
 | 
				
			||||||
 | 
					            public short Short { get; set; }
 | 
				
			||||||
 | 
					            public int Int { get; set; }
 | 
				
			||||||
 | 
					            public long Long { get; set; }
 | 
				
			||||||
 | 
					            public byte Byte { get; set; }
 | 
				
			||||||
 | 
					            public ushort UShort { get; set; }
 | 
				
			||||||
 | 
					            public uint UInt { get; set; }
 | 
				
			||||||
 | 
					            public ulong ULong { get; set; }
 | 
				
			||||||
 | 
					            public double Double { get; set; }
 | 
				
			||||||
 | 
					            public float Float { get; set; }
 | 
				
			||||||
 | 
					            public decimal Decimal { get; set; }
 | 
				
			||||||
 | 
					            public TimeSpan TimeSpan { get; set; }
 | 
				
			||||||
 | 
					            public DateTime DateTime { get; set; }
 | 
				
			||||||
 | 
					            public DateTime DateTimeOffSet { get; set; }
 | 
				
			||||||
 | 
					            public byte[] Bytes { get; set; }
 | 
				
			||||||
 | 
					            public string String { get; set; }
 | 
				
			||||||
 | 
					            public Guid Guid { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public bool? BoolNullable { get; set; }
 | 
				
			||||||
 | 
					            public sbyte? SByteNullable { get; set; }
 | 
				
			||||||
 | 
					            public short? ShortNullable { get; set; }
 | 
				
			||||||
 | 
					            public int? IntNullable { get; set; }
 | 
				
			||||||
 | 
					            public long? testFielLongNullable { get; set; }
 | 
				
			||||||
 | 
					            public byte? ByteNullable { get; set; }
 | 
				
			||||||
 | 
					            public ushort? UShortNullable { get; set; }
 | 
				
			||||||
 | 
					            public uint? UIntNullable { get; set; }
 | 
				
			||||||
 | 
					            public ulong? ULongNullable { get; set; }
 | 
				
			||||||
 | 
					            public double? DoubleNullable { get; set; }
 | 
				
			||||||
 | 
					            public float? FloatNullable { get; set; }
 | 
				
			||||||
 | 
					            public decimal? DecimalNullable { get; set; }
 | 
				
			||||||
 | 
					            public TimeSpan? TimeSpanNullable { get; set; }
 | 
				
			||||||
 | 
					            public DateTime? DateTimeNullable { get; set; }
 | 
				
			||||||
 | 
					            public DateTime? DateTimeOffSetNullable { get; set; }
 | 
				
			||||||
 | 
					            public Guid? GuidNullable { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType1 Enum1 { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType1? Enum1Nullable { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType2 Enum2 { get; set; }
 | 
				
			||||||
 | 
					            public TableAllTypeEnumType2? Enum2Nullable { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public enum TableAllTypeEnumType1 { e1, e2, e3, e5 }
 | 
				
			||||||
 | 
					        [Flags] public enum TableAllTypeEnumType2 { f1, f2, f3 }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,726 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class StringTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<Topic> select => g.dameng.Select<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public int TypeGuid { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true)]
 | 
				
			||||||
 | 
					            public int Guid { get; set; }
 | 
				
			||||||
 | 
					            public int ParentId { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeParentInfo Parent { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeParentInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public List<TestTypeInfo> Types { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestEqualsGuid
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Equals__()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var list = new List<object>();
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.Equals("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Empty()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title ?? "") == string.Empty).ToSql());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (ifnull(a.`Title`, '') = '')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void StartsWith()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var list = new List<object>();
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.StartsWith("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.StartsWith(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.StartsWith(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.StartsWith(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE '%aaa')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', a.`Title`))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', concat(a.`Title`, 1)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', a__Type.`Name`))
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").StartsWith("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").StartsWith(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").StartsWith(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").StartsWith(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE '%aaa')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a.`Title`))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', concat(a.`Title`, 1)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EndsWith()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var list = new List<object>();
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.EndsWith("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.EndsWith(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.EndsWith(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.EndsWith(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE 'aaa%')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat(a.`Title`, '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat(concat(a.`Title`, 1), '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat(a__Type.`Name`, '%'))
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").EndsWith("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").EndsWith(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").EndsWith(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").EndsWith(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE 'aaa%')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat(a.`Title`, '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat(concat(a.`Title`, 1), '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat(a__Type.`Name`, '%'))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Contains()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var list = new List<object>();
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.Contains("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.Contains(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.Contains(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => a.Title.Contains(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE '%aaa%')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', a.`Title`, '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', a.`Title` +1, '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((a.`Title`) LIKE concat('%', a__Type.`Name`, '%'))
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").Contains("aaa")).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").Contains(a.Title)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").Contains(a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            list.Add(select.Where(a => (a.Title + "aaa").Contains(a.Type.Name)).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE '%aaa%')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a.`Title`, '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', concat(a.`Title`, 1), '%'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE((concat(a.`Title`, 'aaa')) LIKE concat('%', a__Type.`Name`, '%'))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToLower()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToLower() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToLower() == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToLower() == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToLower() == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(a.`Title`) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(a.`Title`) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(a.`Title`) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE(lower(a.`Title`) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToLower() + "aaa").ToLower() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToLower() + "aaa").ToLower() == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToLower() + "aaa").ToLower() == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToLower() + "aaa").ToLower() == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(concat(lower(a.`Title`), 'aaa')) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(concat(lower(a.`Title`), 'aaa')) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a
 | 
				
			||||||
 | 
					            //WHERE(lower(concat(lower(a.`Title`), 'aaa')) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type
 | 
				
			||||||
 | 
					            //WHERE(lower(concat(lower(a.`Title`), 'aaa')) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void ToUpper()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToUpper() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToUpper() == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToUpper() == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.ToUpper() == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(a.`Title`) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(a.`Title`) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(a.`Title`) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (upper(a.`Title`) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToUpper() + "aaa").ToUpper() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToUpper() + "aaa").ToUpper() == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToUpper() + "aaa").ToUpper() == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.ToUpper() + "aaa").ToUpper() == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(concat(upper(a.`Title`), 'aaa')) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(concat(upper(a.`Title`), 'aaa')) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (upper(concat(upper(a.`Title`), 'aaa')) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (upper(concat(upper(a.`Title`), 'aaa')) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Substring()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Substring(0) == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Substring(0) == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Substring(0) == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Substring(0) == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(a.`Title`, 1) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(a.`Title`, 1) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(a.`Title`, 1) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (substr(a.`Title`, 1) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Substring(0) + "aaa").Substring(a.Title.Length) == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Substring(0) + "aaa").Substring(0, a.Title.Length) == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Substring(0) + "aaa").Substring(0, 3) == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Substring(0) + "aaa").Substring(1, 2) == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), char_length(a.`Title`) + 1) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), 1, char_length(a.`Title`)) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), 1, 3) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (substr(concat(substr(a.`Title`, 1), 'aaa'), 2, 2) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Length()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Length == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Length == 1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Length == a.Title.Length + 1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Length == a.Type.Name.Length).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(a.`Title`) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(a.`Title`) = 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(a.`Title`) = char_length(a.`Title`) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (char_length(a.`Title`) = char_length(a__Type.`Name`));
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").Length == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").Length == 1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").Length == a.Title.Length + 1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").Length == a.Type.Name.Length).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(concat(a.`Title`, 'aaa')) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(concat(a.`Title`, 'aaa')) = 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (char_length(concat(a.`Title`, 'aaa')) = char_length(a.`Title`) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (char_length(concat(a.`Title`, 'aaa')) = char_length(a__Type.`Name`))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void IndexOf()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.IndexOf("aaa") == -1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.IndexOf("aaa", 2) == -1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.IndexOf("aaa", 2) == (a.Title.Length + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.IndexOf("aaa", 2) == a.Type.Name.Length + 1).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(a.`Title`, 'aaa') - 1) = -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(a.`Title`, 'aaa', 3) - 1) = -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(a.`Title`, 'aaa', 3) - 1) = char_length(a.`Title`) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((locate(a.`Title`, 'aaa', 3) - 1) = char_length(a__Type.`Name`) + 1);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").IndexOf("aaa") == -1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").IndexOf("aaa", 2) == -1).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").IndexOf("aaa", 2) == (a.Title.Length + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").IndexOf("aaa", 2) == a.Type.Name.Length + 1).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa') - 1) = -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa', 3) - 1) = -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa', 3) - 1) = char_length(a.`Title`) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE ((locate(concat(a.`Title`, 'aaa'), 'aaa', 3) - 1) = char_length(a__Type.`Name`) + 1)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void PadLeft()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadLeft(10, 'a') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(a.`Title`, 10, 'a') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(a.`Title`, 10, 'a') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(a.`Title`, 10, 'a') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (lpad(a.`Title`, 10, 'a') = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadLeft(10, 'a') + "aaa").PadLeft(20, 'b') == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadLeft(10, 'a') + "aaa").PadLeft(20, 'b') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadLeft(10, 'a') + "aaa").PadLeft(20, 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadLeft(10, 'a') + "aaa").PadLeft(20, 'b') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (lpad(concat(lpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void PadRight()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadRight(10, 'a') == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadRight(10, 'a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadRight(10, 'a') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.PadRight(10, 'a') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(a.`Title`, 10, 'a') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(a.`Title`, 10, 'a') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(a.`Title`, 10, 'a') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (rpad(a.`Title`, 10, 'a') = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadRight(10, 'a') + "aaa").PadRight(20, 'b') == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadRight(10, 'a') + "aaa").PadRight(20, 'b') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadRight(10, 'a') + "aaa").PadRight(20, 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.PadRight(10, 'a') + "aaa").PadRight(20, 'b') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (rpad(concat(rpad(a.`Title`, 10, 'a'), 'aaa'), 20, 'b') = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Trim()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Trim() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Trim('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Trim('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Trim('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(a.`Title`) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim('a' from a.`Title`) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim('b' from trim('a' from a.`Title`)) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim('c' from trim('b' from trim('a' from a.`Title`))) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Trim() + "aaa").Trim() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Trim('a') + "aaa").Trim('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Trim('a', 'b') + "aaa").Trim('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Trim('a', 'b', 'c') + "aaa").Trim('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(concat(trim(a.`Title`), 'aaa')) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim('a' from concat(trim('a' from a.`Title`), 'aaa')) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim('b' from trim('a' from concat(trim('b' from trim('a' from a.`Title`)), 'aaa'))) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim('c' from trim('b' from trim('a' from concat(trim('c' from trim('b' from trim('a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TrimStart()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimStart() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimStart('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimStart('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimStart('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (ltrim(a.`Title`) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'a' from trim(leading 'a' from a.`Title`)) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))))) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimStart() + "aaa").TrimStart() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimStart('a') + "aaa").TrimStart('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimStart('a', 'b') + "aaa").TrimStart('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimStart('a', 'b', 'c') + "aaa").TrimStart('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (ltrim(concat(ltrim(a.`Title`), 'aaa')) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'a' from trim(leading 'a' from concat(trim(trailing 'a' from trim(leading 'a' from a.`Title`)), 'aaa'))) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from concat(trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))), 'aaa'))))) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from concat(trim(trailing 'c' from trim(leading 'c' from trim(trailing 'b' from trim(leading 'b' from trim(trailing 'a' from trim(leading 'a' from a.`Title`)))))), 'aaa'))))))) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TrimEnd()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimEnd() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimEnd('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimEnd('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.TrimEnd('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rtrim(a.`Title`) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'a' from a.`Title`) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'b' from trim(trailing 'a' from a.`Title`)) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from a.`Title`))) = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimEnd() + "aaa").TrimEnd() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimEnd('a') + "aaa").TrimEnd('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimEnd('a', 'b') + "aaa").TrimEnd('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.TrimEnd('a', 'b', 'c') + "aaa").TrimEnd('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (rtrim(concat(rtrim(a.`Title`), 'aaa')) = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'a' from concat(trim(trailing 'a' from a.`Title`), 'aaa')) = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'b' from trim(trailing 'a' from concat(trim(trailing 'b' from trim(trailing 'a' from a.`Title`)), 'aaa'))) = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from concat(trim(trailing 'c' from trim(trailing 'b' from trim(trailing 'a' from a.`Title`))), 'aaa')))) = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Replace()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Replace("a", "b") == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c") == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c").Replace("c", "a") == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.Replace("a", "b").Replace("b", "c").Replace(a.Type.Name, "a") == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (replace(a.`Title`, 'a', 'b') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (replace(replace(a.`Title`, 'a', 'b'), 'b', 'c') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), 'c', 'a') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), a__Type.`Name`, 'a') = a__Type.`Name`);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Replace("a", "b") + "aaa").TrimEnd() == "aaa").ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Replace("a", "b").Replace("b", "c") + "aaa").TrimEnd('a') == a.Title).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Replace("a", "b").Replace("b", "c").Replace("c", "a") + "aaa").TrimEnd('a', 'b') == (a.Title + 1)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title.Replace("a", "b").Replace("b", "c").Replace(a.Type.Name, "a") + "aaa").TrimEnd('a', 'b', 'c') == a.Type.Name).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (concat(replace(a.`Title`, 'a', 'b'), 'aaa') = 'aaa');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (concat(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), 'aaa') = a.`Title`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (concat(replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), 'c', 'a'), 'aaa') = concat(a.`Title`, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (concat(replace(replace(replace(a.`Title`, 'a', 'b'), 'b', 'c'), a__Type.`Name`, 'a'), 'aaa') = a__Type.`Name`)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void CompareTo()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.CompareTo(a.Title) == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.CompareTo(a.Title) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.CompareTo(a.Title + 1) == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.Title.CompareTo(a.Title + a.Type.Name) == 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(a.`Title`, a.`Title`) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(a.`Title`, a.`Title`) > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(a.`Title`, concat(a.`Title`, 1)) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(a.`Title`, concat(a.`Title`, a__Type.`Name`)) = 0);
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").CompareTo("aaa") == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").CompareTo(a.Title) > 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").CompareTo(a.Title + 1) == 0).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => (a.Title + "aaa").CompareTo(a.Type.Name) == 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(concat(a.`Title`, 'aaa'), 'aaa') = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(concat(a.`Title`, 'aaa'), a.`Title`) > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(concat(a.`Title`, 'aaa'), concat(a.`Title`, 1)) = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a, `TestTypeInfo` a__Type 
 | 
				
			||||||
 | 
					            //WHERE (strcmp(concat(a.`Title`, 'aaa'), a__Type.`Name`) = 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void string_IsNullOrEmpty()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => string.IsNullOrEmpty(a.Title)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => !string.IsNullOrEmpty(a.Title)).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void string_IsNullOrWhiteSpace()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => string.IsNullOrWhiteSpace(a.Title)).ToList());
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => !string.IsNullOrWhiteSpace(a.Title)).ToList());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,293 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengExpression
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class TimeSpanTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ISelect<Topic> select => g.dameng.Select<Topic>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Table(Name = "tb_topic")]
 | 
				
			||||||
 | 
					        class Topic
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            [Column(IsIdentity = true, IsPrimary = true)]
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public int Clicks { get; set; }
 | 
				
			||||||
 | 
					            public int TypeGuid { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeInfo Type { get; set; }
 | 
				
			||||||
 | 
					            public string Title { get; set; }
 | 
				
			||||||
 | 
					            public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Guid { get; set; }
 | 
				
			||||||
 | 
					            public int ParentId { get; set; }
 | 
				
			||||||
 | 
					            public TestTypeParentInfo Parent { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        class TestTypeParentInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public int Id { get; set; }
 | 
				
			||||||
 | 
					            public string Name { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            public List<TestTypeInfo> Types { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Zero()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.Zero).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void MinValue()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay > TimeSpan.MinValue).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) > -922337203685477580)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void MaxValue()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay < TimeSpan.MaxValue).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) < 922337203685477580)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Days()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Days == 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 86400000000) = 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Hours()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Hours > 0).ToSql());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 3600000000) mod 24 > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Milliseconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Milliseconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000 mod 1000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Minutes()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Minutes > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 60000000 mod 60) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Seconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Seconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) div 1000000 mod 60) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Ticks()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Ticks > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) * 10) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TotalDays()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalDays > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 86400000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TotalHours()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalHours > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 3600000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TotalMilliseconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMilliseconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TotalMinutes()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalMinutes > 0).ToSql());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 60000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TotalSeconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.TotalSeconds > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) / 1000000) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Add()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Add(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) + (1 * 86400000000)) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Subtract()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Subtract(TimeSpan.FromDays(1)) > TimeSpan.Zero).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) - (1 * 86400000000)) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void CompareTo()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.CompareTo(TimeSpan.FromDays(1)) > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void this_Equals()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.Equals(TimeSpan.FromDays(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void this_ToString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => a.CreateTime.TimeOfDay.ToString() == "ssss").ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (date_format(date_add(cast('0001/1/1 0:00:00' as datetime), interval (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) microsecond), '%Y-%m-%d %H:%i:%s.%f') = 'ssss')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_Compare()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Compare(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1)) > 0).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) - ((1 * 86400000000))) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_Equals()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromDays()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromDays(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 86400000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromHours()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromHours(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 3600000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromMilliseconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMilliseconds(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromMinutes()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromMinutes(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 60000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromSeconds()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromSeconds(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 * 1000000)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_FromTicks()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Equals(a.CreateTime.TimeOfDay, TimeSpan.FromTicks(1))).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE ((timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000) = (1 / 10)))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan_Parse()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var data = new List<object>();
 | 
				
			||||||
 | 
					            data.Add(select.Where(a => TimeSpan.Parse(a.CreateTime.TimeOfDay.ToString()) > TimeSpan.Zero).ToList());
 | 
				
			||||||
 | 
					            //SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 
 | 
				
			||||||
 | 
					            //FROM `tb_topic` a 
 | 
				
			||||||
 | 
					            //WHERE (cast(date_format(date_add(cast('0001/1/1 0:00:00' as datetime), interval (timestampdiff(microsecond, date_format(a.`CreateTime`, '1970-1-1 %H:%i:%s.%f'), a.`CreateTime`) + 62135596800000000)) microsecond), '%Y-%m-%d %H:%i:%s.%f') as signed) > 0)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1571
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1571
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1105
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1105
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolTest.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Numerics;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengMapType
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DateTimeOffSetTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        class Dtos_dt
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(DateTime))]
 | 
				
			||||||
 | 
					            public DateTimeOffset dtos_to_dt { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(DateTime))]
 | 
				
			||||||
 | 
					            public DateTimeOffset? dtofnil_to_dt { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTimeToDateTimeOffSet()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new Dtos_dt { dtos_to_dt = DateTimeOffset.Now, dtofnil_to_dt = DateTimeOffset.Now };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<Dtos_dt>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<Dtos_dt>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtos_to_dt.ToString("g"), find.dtos_to_dt.ToString("g"));
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtofnil_to_dt.Value.ToString("g"), find.dtofnil_to_dt.Value.ToString("g"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.dtos_to_dt = DateTimeOffset.Now;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<Dtos_dt>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<Dtos_dt>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtos_to_dt.ToString("g"), find.dtos_to_dt.ToString("g"));
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtofnil_to_dt.Value.ToString("g"), find.dtofnil_to_dt.Value.ToString("g"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<Dtos_dt>().Where(a => a.id == item.id).Set(a => a.dtos_to_dt, item.dtos_to_dt = DateTimeOffset.Now).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<Dtos_dt>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtos_to_dt.ToString("g"), find.dtos_to_dt.ToString("g"));
 | 
				
			||||||
 | 
					            Assert.Equal(item.dtofnil_to_dt.Value.ToString("g"), find.dtofnil_to_dt.Value.ToString("g"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<Dtos_dt>().Where(a => a.id == item.id).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<Dtos_dt>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										261
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										261
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,261 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Numerics;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengMapType
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class EnumTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        class EnumTestMap
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum enum_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum? enumnullable_to_string { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(int))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum enum_to_int { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(int?))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum? enumnullable_to_int { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public enum ToStringMapEnum { <EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, abc, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EnumToString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new EnumTestMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new EnumTestMap { enum_to_string = ToStringMapEnum.abc };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enum_to_string = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enum_to_string = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enum_to_string, ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enum_to_string, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EnumNullableToString()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new EnumTestMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new EnumTestMap { enumnullable_to_string = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD> };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enumnullable_to_string = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enumnullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EnumToInt()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new EnumTestMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_int, find.enum_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new EnumTestMap { enum_to_int = ToStringMapEnum.abc };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_int, find.enum_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enum_to_int = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_int, find.enum_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enum_to_int = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_int, find.enum_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enum_to_int, ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enum_to_int, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enum_to_int == ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EnumNullableToInt()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new EnumTestMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_int, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new EnumTestMap { enumnullable_to_int = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD> };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<EnumTestMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_int, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enumnullable_to_int = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_int, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enumnullable_to_int = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_int, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_int, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<EnumTestMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_int, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.abc).First());
 | 
				
			||||||
 | 
					            find = orm.Select<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<EnumTestMap>().Where(a => a.id == item.id && a.enumnullable_to_int == null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<EnumTestMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										570
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										570
									
								
								FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,570 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Numerics;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.DamengMapType
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class ToStringTest
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        class ToStringMap
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public Guid id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public TimeSpan timespan_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public TimeSpan? timespannullable_to_string { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public DateTime datetime_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public DateTime? datetimenullable_to_string { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public Guid guid_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public Guid? guidnullable_to_string { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum enum_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public ToStringMapEnum? enumnullable_to_string { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public BigInteger biginteger_to_string { get; set; }
 | 
				
			||||||
 | 
					            [Column(MapType = typeof(string))]
 | 
				
			||||||
 | 
					            public BigInteger? bigintegernullable_to_string { get; set; }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public enum ToStringMapEnum { <EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, abc, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Enum1()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { enum_to_string = ToStringMapEnum.abc };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enum_to_string = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enum_to_string = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enum_to_string, find.enum_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.enum_to_string, ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.enum_to_string, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enum_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enum_to_string == ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void EnumNullable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { enumnullable_to_string = ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD> };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.enumnullable_to_string = ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.enumnullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).First());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, ToStringMapEnum.abc).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(ToStringMapEnum.abc, find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.enumnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.enumnullable_to_string == null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void BigInteger1()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 0).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.biginteger_to_string, find.biginteger_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(0, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { biginteger_to_string = 100 };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 100).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.biginteger_to_string, find.biginteger_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(100, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.biginteger_to_string = 200;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 200).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.biginteger_to_string, find.biginteger_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(200, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.biginteger_to_string = 205;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 205).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.biginteger_to_string, find.biginteger_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(205, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.biginteger_to_string, 522).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 522).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(522, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.biginteger_to_string, 10005).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 10005).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(10005, find.biginteger_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 522).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 205).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.biginteger_to_string == 10005).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void BigIntegerNullable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { bigintegernullable_to_string = 101 };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 101).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(101, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.bigintegernullable_to_string = 2004;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 2004).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(2004, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.bigintegernullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 2004).First());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.bigintegernullable_to_string, 998).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(998, find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.bigintegernullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).First());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.bigintegernullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(0, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == 2004).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpan1()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespan_to_string, find.timespan_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.Zero, find.timespan_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { timespan_to_string = TimeSpan.FromDays(1) };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespan_to_string, find.timespan_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromDays(1), find.timespan_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.timespan_to_string = TimeSpan.FromHours(10);
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespan_to_string, find.timespan_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromHours(10), find.timespan_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.timespan_to_string, TimeSpan.FromHours(11)).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromHours(11), find.timespan_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void TimeSpanNullable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespannullable_to_string, find.timespannullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { timespannullable_to_string = TimeSpan.FromDays(1) };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespannullable_to_string, find.timespannullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromDays(1), find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.timespannullable_to_string = TimeSpan.FromHours(10);
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespannullable_to_string, find.timespannullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromHours(10), find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.timespannullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.timespannullable_to_string, find.timespannullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.timespannullable_to_string, TimeSpan.FromHours(11)).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(TimeSpan.FromHours(11), find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.timespannullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.timespannullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTime1()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetime_to_string, find.datetime_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.MinValue, find.datetime_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { datetime_to_string = DateTime.Parse("2000-1-1") };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetime_to_string, find.datetime_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-1"), find.datetime_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.datetime_to_string = DateTime.Parse("2000-1-11");
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetime_to_string, find.datetime_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-11"), find.datetime_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.datetime_to_string, DateTime.Parse("2000-1-12")).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-12"), find.datetime_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void DateTimeNullable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetimenullable_to_string, find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item = new ToStringMap { datetimenullable_to_string = DateTime.Parse("2000-1-1") };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetimenullable_to_string, find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-1"), find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            item.datetimenullable_to_string = DateTime.Parse("2000-1-11");
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetimenullable_to_string, find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-11"), find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.datetimenullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.datetimenullable_to_string, find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.datetimenullable_to_string, DateTime.Parse("2000-1-12")).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(DateTime.Parse("2000-1-12"), find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.datetimenullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.datetimenullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Guid1()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guid_to_string == Guid.Empty).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guid_to_string, find.guid_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(Guid.Empty, find.guid_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            item = new ToStringMap { guid_to_string = newid };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guid_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guid_to_string, find.guid_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guid_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            item.guid_to_string = newid;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guid_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guid_to_string, find.guid_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guid_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.guid_to_string, newid).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guid_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guid_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.guid_to_string == newid).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GuidNullable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //insert
 | 
				
			||||||
 | 
					            var orm = g.dameng;
 | 
				
			||||||
 | 
					            var item = new ToStringMap { };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            var find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            item = new ToStringMap { guidnullable_to_string = newid };
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Insert<ToStringMap>().AppendData(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update all
 | 
				
			||||||
 | 
					            newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            item.guidnullable_to_string = newid;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            item.guidnullable_to_string = null;
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().SetSource(item).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					            Assert.Null(find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //update set
 | 
				
			||||||
 | 
					            newid = Guid.NewGuid();
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.guidnullable_to_string, newid).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == newid).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Equal(newid, find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Update<ToStringMap>().Where(a => a.id == item.id).Set(a => a.guidnullable_to_string, null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            find = orm.Select<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == null).First();
 | 
				
			||||||
 | 
					            Assert.NotNull(find);
 | 
				
			||||||
 | 
					            Assert.Equal(item.id, find.id);
 | 
				
			||||||
 | 
					            Assert.Null(find.guidnullable_to_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //delete
 | 
				
			||||||
 | 
					            Assert.Equal(1, orm.Delete<ToStringMap>().Where(a => a.id == item.id && a.guidnullable_to_string == null).ExecuteAffrows());
 | 
				
			||||||
 | 
					            Assert.Null(orm.Select<ToStringMap>().Where(a => a.id == item.id).First());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -34,6 +34,7 @@
 | 
				
			|||||||
	  <ProjectReference Include="..\..\Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj" />
 | 
						  <ProjectReference Include="..\..\Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj" />
 | 
				
			||||||
	  <ProjectReference Include="..\..\FreeSql.DbContext\FreeSql.DbContext.csproj" />
 | 
						  <ProjectReference Include="..\..\FreeSql.DbContext\FreeSql.DbContext.csproj" />
 | 
				
			||||||
	  <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
 | 
						  <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
 | 
				
			||||||
 | 
						  <ProjectReference Include="..\..\Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj" />
 | 
				
			||||||
	  <ProjectReference Include="..\..\Providers\FreeSql.Provider.MsAccess\FreeSql.Provider.MsAccess.csproj" />
 | 
						  <ProjectReference Include="..\..\Providers\FreeSql.Provider.MsAccess\FreeSql.Provider.MsAccess.csproj" />
 | 
				
			||||||
	  <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
 | 
						  <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
 | 
				
			||||||
	  <ProjectReference Include="..\..\Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj" />
 | 
						  <ProjectReference Include="..\..\Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj" />
 | 
				
			||||||
@@ -42,4 +43,10 @@
 | 
				
			|||||||
	  <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
 | 
						  <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
 | 
				
			||||||
	</ItemGroup>
 | 
						</ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<ItemGroup>
 | 
				
			||||||
 | 
						  <Reference Include="DmProvider">
 | 
				
			||||||
 | 
						    <HintPath>..\..\Providers\FreeSql.Provider.Dameng\lib\DmProvider\netstandard2.0\DmProvider.dll</HintPath>
 | 
				
			||||||
 | 
						  </Reference>
 | 
				
			||||||
 | 
						</ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -105,4 +105,19 @@ public class g
 | 
				
			|||||||
            )
 | 
					            )
 | 
				
			||||||
        .Build());
 | 
					        .Build());
 | 
				
			||||||
    public static IFreeSql msaccess => msaccessLazy.Value;
 | 
					    public static IFreeSql msaccess => msaccessLazy.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static Lazy<IFreeSql> damengLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
 | 
					    .UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=5")
 | 
				
			||||||
 | 
					     //.UseConnectionFactory(FreeSql.DataType.Dameng, () => new Dm.DmConnection("data source=127.0.0.1:5236;user id=2user;password=123456789;Pooling=true;Max Pool Size=2"))
 | 
				
			||||||
 | 
					     .UseAutoSyncStructure(true)
 | 
				
			||||||
 | 
					    .UseLazyLoading(true)
 | 
				
			||||||
 | 
					    .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
 | 
					    //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .UseMonitorCommand(
 | 
				
			||||||
 | 
					        cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
 | 
				
			||||||
 | 
					        (cmd, traceLog) => Console.WriteLine(traceLog))
 | 
				
			||||||
 | 
					    .Build());
 | 
				
			||||||
 | 
					    public static IFreeSql dameng => damengLazy.Value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								FreeSql.sln
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								FreeSql.sln
									
									
									
									
									
								
							@@ -78,6 +78,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.All", "FreeSql.All\
 | 
				
			|||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.Linq", "Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj", "{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}"
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.Linq", "Extensions\FreeSql.Extensions.Linq\FreeSql.Extensions.Linq.csproj", "{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}"
 | 
				
			||||||
EndProject
 | 
					EndProject
 | 
				
			||||||
 | 
					Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Dameng", "Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj", "{E74D90E8-1CBC-4677-817B-1CA05AB97937}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
Global
 | 
					Global
 | 
				
			||||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
		Debug|Any CPU = Debug|Any CPU
 | 
							Debug|Any CPU = Debug|Any CPU
 | 
				
			||||||
@@ -472,6 +474,18 @@ Global
 | 
				
			|||||||
		{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x64.Build.0 = Release|Any CPU
 | 
							{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x64.Build.0 = Release|Any CPU
 | 
				
			||||||
		{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x86.ActiveCfg = Release|Any CPU
 | 
							{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x86.ActiveCfg = Release|Any CPU
 | 
				
			||||||
		{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x86.Build.0 = Release|Any CPU
 | 
							{57B3F5B0-D46A-4442-8EC6-9A9A784404B7}.Release|x86.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|x64.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|x64.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|x86.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Debug|x86.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|x64.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|x64.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|x86.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937}.Release|x86.Build.0 = Release|Any CPU
 | 
				
			||||||
	EndGlobalSection
 | 
						EndGlobalSection
 | 
				
			||||||
	GlobalSection(SolutionProperties) = preSolution
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
		HideSolutionNode = FALSE
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
@@ -499,6 +513,7 @@ Global
 | 
				
			|||||||
		{B397A761-F646-41CF-A160-AB6C05DAF2FB} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
 | 
							{B397A761-F646-41CF-A160-AB6C05DAF2FB} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
 | 
				
			||||||
		{773D5B63-DE6E-46DB-AF16-6FB1C1352B3F} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
 | 
							{773D5B63-DE6E-46DB-AF16-6FB1C1352B3F} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
 | 
				
			||||||
		{57B3F5B0-D46A-4442-8EC6-9A9A784404B7} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
 | 
							{57B3F5B0-D46A-4442-8EC6-9A9A784404B7} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
 | 
				
			||||||
 | 
							{E74D90E8-1CBC-4677-817B-1CA05AB97937} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
 | 
				
			||||||
	EndGlobalSection
 | 
						EndGlobalSection
 | 
				
			||||||
	GlobalSection(ExtensibilityGlobals) = postSolution
 | 
						GlobalSection(ExtensibilityGlobals) = postSolution
 | 
				
			||||||
		SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
 | 
							SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ namespace FreeSql
 | 
				
			|||||||
        Odbc,
 | 
					        Odbc,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 武汉达梦数据库有限公司
 | 
					        /// 武汉达梦数据库有限公司,基于 Odbc 的实现
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        OdbcDameng,
 | 
					        OdbcDameng,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,5 +30,10 @@ namespace FreeSql
 | 
				
			|||||||
        /// Microsoft Office Access 是由微软发布的关联式数据库管理系统
 | 
					        /// Microsoft Office Access 是由微软发布的关联式数据库管理系统
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        MsAccess,
 | 
					        MsAccess,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 武汉达梦数据库有限公司,基于 DmProvider.dll 的实现
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        Dameng
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -533,7 +533,7 @@
 | 
				
			|||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="F:FreeSql.DataType.OdbcDameng">
 | 
					        <member name="F:FreeSql.DataType.OdbcDameng">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            武汉达梦数据库有限公司
 | 
					            武汉达梦数据库有限公司,基于 Odbc 的实现
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="F:FreeSql.DataType.MsAccess">
 | 
					        <member name="F:FreeSql.DataType.MsAccess">
 | 
				
			||||||
@@ -541,6 +541,11 @@
 | 
				
			|||||||
            Microsoft Office Access 是由微软发布的关联式数据库管理系统
 | 
					            Microsoft Office Access 是由微软发布的关联式数据库管理系统
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.DataType.Dameng">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            武汉达梦数据库有限公司,基于 DmProvider.dll 的实现
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)">
 | 
					        <member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
 | 
					            获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -216,6 +216,11 @@ namespace FreeSql
 | 
				
			|||||||
                        if (type == null) throwNotFind("FreeSql.Provider.MsAccess.dll", "FreeSql.MsAccess.MsAccessProvider<>");
 | 
					                        if (type == null) throwNotFind("FreeSql.Provider.MsAccess.dll", "FreeSql.MsAccess.MsAccessProvider<>");
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    case DataType.Dameng:
 | 
				
			||||||
 | 
					                        type = Type.GetType("FreeSql.Dameng.DamengProvider`1,FreeSql.Provider.Dameng")?.MakeGenericType(typeof(TMark));
 | 
				
			||||||
 | 
					                        if (type == null) throwNotFind("FreeSql.Provider.Dameng.dll", "FreeSql.Dameng.DamengProvider<>");
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    default: throw new Exception("未指定 UseConnectionString 或者 UseConnectionFactory");
 | 
					                    default: throw new Exception("未指定 UseConnectionString 或者 UseConnectionFactory");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -803,7 +803,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    var propGetSetMethod = prop.GetSetMethod(true);
 | 
					                    var propGetSetMethod = prop.GetSetMethod(true);
 | 
				
			||||||
                    Expression readExpAssign = null; //加速缓存
 | 
					                    Expression readExpAssign = null; //加速缓存
 | 
				
			||||||
                    if (prop.PropertyType.IsArray) readExpAssign = Expression.New(Utils.RowInfo.Constructor,
 | 
					                    if (prop.PropertyType.IsArray) readExpAssign = Expression.New(Utils.RowInfo.Constructor,
 | 
				
			||||||
                        Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp)),
 | 
					                        Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp })),
 | 
				
			||||||
                        //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                        //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }),
 | 
				
			||||||
                        Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                        Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
@@ -813,7 +813,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First();
 | 
					                        if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First();
 | 
				
			||||||
                        if (proptypeGeneric.IsEnum ||
 | 
					                        if (proptypeGeneric.IsEnum ||
 | 
				
			||||||
                            Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(Utils.RowInfo.Constructor,
 | 
					                            Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(Utils.RowInfo.Constructor,
 | 
				
			||||||
                                Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp)),
 | 
					                                Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp })),
 | 
				
			||||||
                                //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                                //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }),
 | 
				
			||||||
                                Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                                Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
@@ -1069,6 +1069,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                case DataType.Sqlite:
 | 
					                case DataType.Sqlite:
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                case DataType.OdbcDameng:
 | 
					                case DataType.OdbcDameng:
 | 
				
			||||||
 | 
					                case DataType.Dameng:
 | 
				
			||||||
                    _tosqlAppendContent = $" for update{(noawait ? " nowait" : "")}";
 | 
					                    _tosqlAppendContent = $" for update{(noawait ? " nowait" : "")}";
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1235,7 +1235,12 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            public static PropertyInfo PropertyValue = typeof(RowInfo).GetProperty("Value");
 | 
					            public static PropertyInfo PropertyValue = typeof(RowInfo).GetProperty("Value");
 | 
				
			||||||
            public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
 | 
					            public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        internal static MethodInfo MethodDataReaderGetValue = typeof(DbDataReader).GetMethod("GetValue");
 | 
					        internal static MethodInfo MethodDataReaderGetValue = typeof(Utils).GetMethod("InternalDataReaderGetValue", BindingFlags.Static | BindingFlags.NonPublic);
 | 
				
			||||||
 | 
					        internal static object InternalDataReaderGetValue(CommonUtils commonUtil, DbDataReader dr, int index)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (commonUtil._orm.Ado.DataType == DataType.Dameng && dr.IsDBNull(index)) return null;
 | 
				
			||||||
 | 
					            return dr.GetValue(index);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils)
 | 
					        internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(flagStr)) flagStr = "all";
 | 
					            if (string.IsNullOrEmpty(flagStr)) flagStr = "all";
 | 
				
			||||||
@@ -1252,8 +1257,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    if (type.IsArray) return Expression.Lambda<Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(
 | 
					                    if (type.IsArray) return Expression.Lambda<Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(
 | 
				
			||||||
                        Expression.New(RowInfo.Constructor,
 | 
					                        Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                            GetDataReaderValueBlockExpression(type, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)),
 | 
					                            GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })),
 | 
				
			||||||
                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }),
 | 
				
			||||||
                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                        ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile();
 | 
					                        ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1263,8 +1268,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                        dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric))
 | 
					                        dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric))
 | 
				
			||||||
                        return Expression.Lambda<Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(
 | 
					                        return Expression.Lambda<Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(
 | 
				
			||||||
                        Expression.New(RowInfo.Constructor,
 | 
					                        Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                            GetDataReaderValueBlockExpression(type, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)),
 | 
					                            GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })),
 | 
				
			||||||
                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }),
 | 
				
			||||||
                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                        ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile();
 | 
					                        ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1284,8 +1289,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                Expression read2ExpAssign = null; //加速缓存
 | 
					                                Expression read2ExpAssign = null; //加速缓存
 | 
				
			||||||
                                if (field.FieldType.IsArray) read2ExpAssign = Expression.New(RowInfo.Constructor,
 | 
					                                if (field.FieldType.IsArray) read2ExpAssign = Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                                    GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)),
 | 
					                                    GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })),
 | 
				
			||||||
                                    //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                                    //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }),
 | 
				
			||||||
                                    Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                                    Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                                );
 | 
					                                );
 | 
				
			||||||
                                else
 | 
					                                else
 | 
				
			||||||
@@ -1294,8 +1299,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                    if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GetGenericArguments().First();
 | 
					                                    if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GetGenericArguments().First();
 | 
				
			||||||
                                    if (fieldtypeGeneric.IsEnum ||
 | 
					                                    if (fieldtypeGeneric.IsEnum ||
 | 
				
			||||||
                                        dicExecuteArrayRowReadClassOrTuple.ContainsKey(fieldtypeGeneric)) read2ExpAssign = Expression.New(RowInfo.Constructor,
 | 
					                                        dicExecuteArrayRowReadClassOrTuple.ContainsKey(fieldtypeGeneric)) read2ExpAssign = Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                                            GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)),
 | 
					                                            GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })),
 | 
				
			||||||
                                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }),
 | 
				
			||||||
                                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
					                                            Expression.Add(dataIndexExp, Expression.Constant(1))
 | 
				
			||||||
                                    );
 | 
					                                    );
 | 
				
			||||||
                                    else
 | 
					                                    else
 | 
				
			||||||
@@ -1336,8 +1341,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                Expression.IfThen(
 | 
					                                Expression.IfThen(
 | 
				
			||||||
                                    Expression.LessThan(dataIndexExp, rowLenExp),
 | 
					                                    Expression.LessThan(dataIndexExp, rowLenExp),
 | 
				
			||||||
                                        Expression.Return(returnTarget, Expression.New(RowInfo.Constructor,
 | 
					                                        Expression.Return(returnTarget, Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                                            GetDataReaderValueBlockExpression(type, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)),
 | 
					                                            GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })),
 | 
				
			||||||
                                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp) }),
 | 
					                                            //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }),
 | 
				
			||||||
                                            Expression.Add(dataIndexExp, Expression.Constant(1))))
 | 
					                                            Expression.Add(dataIndexExp, Expression.Constant(1))))
 | 
				
			||||||
                                ),
 | 
					                                ),
 | 
				
			||||||
                                Expression.Label(returnTarget, Expression.Default(typeof(RowInfo)))
 | 
					                                Expression.Label(returnTarget, Expression.Default(typeof(RowInfo)))
 | 
				
			||||||
@@ -1391,7 +1396,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                            var readType = typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) ? trycol.Attribute.MapType : ctorParm.ParameterType;
 | 
					                            var readType = typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) ? trycol.Attribute.MapType : ctorParm.ParameterType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            var ispkExp = new List<Expression>();
 | 
					                            var ispkExp = new List<Expression>();
 | 
				
			||||||
                            Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp));
 | 
					                            Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }));
 | 
				
			||||||
                            Expression readExpAssign = null; //加速缓存
 | 
					                            Expression readExpAssign = null; //加速缓存
 | 
				
			||||||
                            if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor,
 | 
					                            if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                                GetDataReaderValueBlockExpression(readType, readpkvalExp),
 | 
					                                GetDataReaderValueBlockExpression(readType, readpkvalExp),
 | 
				
			||||||
@@ -1407,7 +1412,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                {
 | 
					                                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    //判断主键为空,则整个对象不读取
 | 
					                                    //判断主键为空,则整个对象不读取
 | 
				
			||||||
                                    //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)));
 | 
					                                    //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })));
 | 
				
			||||||
                                    if (trycol?.Attribute.IsPrimary == true)
 | 
					                                    if (trycol?.Attribute.IsPrimary == true)
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                        ispkExp.Add(
 | 
					                                        ispkExp.Add(
 | 
				
			||||||
@@ -1498,7 +1503,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                            var ispkExp = new List<Expression>();
 | 
					                            var ispkExp = new List<Expression>();
 | 
				
			||||||
                            var propGetSetMethod = prop.GetSetMethod(true);
 | 
					                            var propGetSetMethod = prop.GetSetMethod(true);
 | 
				
			||||||
                            Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, tryidxExp));
 | 
					                            Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, tryidxExp }));
 | 
				
			||||||
                            Expression readExpAssign = null; //加速缓存
 | 
					                            Expression readExpAssign = null; //加速缓存
 | 
				
			||||||
                            if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor,
 | 
					                            if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor,
 | 
				
			||||||
                                GetDataReaderValueBlockExpression(readType, readpkvalExp),
 | 
					                                GetDataReaderValueBlockExpression(readType, readpkvalExp),
 | 
				
			||||||
@@ -1514,7 +1519,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                {
 | 
					                                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                    //判断主键为空,则整个对象不读取
 | 
					                                    //判断主键为空,则整个对象不读取
 | 
				
			||||||
                                    //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, dataIndexExp)));
 | 
					                                    //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })));
 | 
				
			||||||
                                    if (flagStr.StartsWith("adoQuery") == false && //Ado.Query 的时候不作此判断
 | 
					                                    if (flagStr.StartsWith("adoQuery") == false && //Ado.Query 的时候不作此判断
 | 
				
			||||||
                                        trycol?.Attribute.IsPrimary == true) //若主键值为 null,则整行读取出来的对象为 null
 | 
					                                        trycol?.Attribute.IsPrimary == true) //若主键值为 null,则整行读取出来的对象为 null
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengDelete.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengDelete.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng.Curd
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengDelete<T1> : Internal.CommonProvider.DeleteProvider<T1> where T1 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengDelete(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
 | 
				
			||||||
 | 
					            : base(orm, commonUtils, commonExpression, dywhere)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override List<T1> ExecuteDeleted()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw new NotImplementedException();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if net40
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        public override Task<List<T1>> ExecuteDeletedAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw new NotImplementedException();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										222
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengInsert.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,222 @@
 | 
				
			|||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng.Curd
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengInsert<T1> : Internal.CommonProvider.InsertProvider<T1> where T1 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengInsert(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
 | 
				
			||||||
 | 
					            : base(orm, commonUtils, commonExpression)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
 | 
				
			||||||
 | 
					        public override long ExecuteIdentity() => base.SplitExecuteIdentity(_batchValuesLimit > 0 ? _batchValuesLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
 | 
				
			||||||
 | 
					        public override List<T1> ExecuteInserted() => base.SplitExecuteInserted(_batchValuesLimit > 0 ? _batchValuesLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string ToSql()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_source == null || _source.Any() == false) return null;
 | 
				
			||||||
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
 | 
					            sb.Append("INSERT ");
 | 
				
			||||||
 | 
					            if (_source.Count > 1) sb.Append("ALL");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _identCol = null;
 | 
				
			||||||
 | 
					            var sbtb = new StringBuilder();
 | 
				
			||||||
 | 
					            sbtb.Append("INTO ");
 | 
				
			||||||
 | 
					            sbtb.Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append("(");
 | 
				
			||||||
 | 
					            var colidx = 0;
 | 
				
			||||||
 | 
					            foreach (var col in _table.Columns.Values)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (col.Attribute.IsIdentity) _identCol = col;
 | 
				
			||||||
 | 
					                if (col.Attribute.IsIdentity && _insertIdentity == false && string.IsNullOrEmpty(col.DbInsertValue)) continue;
 | 
				
			||||||
 | 
					                if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (colidx > 0) sbtb.Append(", ");
 | 
				
			||||||
 | 
					                sbtb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name));
 | 
				
			||||||
 | 
					                ++colidx;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            sbtb.Append(") ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _params = _noneParameter ? new DbParameter[0] : new DbParameter[colidx * _source.Count];
 | 
				
			||||||
 | 
					            var specialParams = new List<DbParameter>();
 | 
				
			||||||
 | 
					            var didx = 0;
 | 
				
			||||||
 | 
					            foreach (var d in _source)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (_source.Count > 1) sb.Append("\r\n");
 | 
				
			||||||
 | 
					                sb.Append(sbtb);
 | 
				
			||||||
 | 
					                sb.Append("VALUES");
 | 
				
			||||||
 | 
					                sb.Append("(");
 | 
				
			||||||
 | 
					                var colidx2 = 0;
 | 
				
			||||||
 | 
					                foreach (var col in _table.Columns.Values)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (col.Attribute.IsIdentity && _insertIdentity == false && string.IsNullOrEmpty(col.DbInsertValue)) continue;
 | 
				
			||||||
 | 
					                    if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (colidx2 > 0) sb.Append(", ");
 | 
				
			||||||
 | 
					                    if (string.IsNullOrEmpty(col.DbInsertValue) == false)
 | 
				
			||||||
 | 
					                        sb.Append(col.DbInsertValue);
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        object val = col.GetMapValue(d);
 | 
				
			||||||
 | 
					                        if (_noneParameter)
 | 
				
			||||||
 | 
					                            sb.Append(_commonUtils.GetNoneParamaterSqlValue(specialParams, col.Attribute.MapType, val));
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"{col.CsName}_{didx}")));
 | 
				
			||||||
 | 
					                            _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}_{didx}", col, col.Attribute.MapType, val);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    ++colidx2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Append(")");
 | 
				
			||||||
 | 
					                ++didx;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL");
 | 
				
			||||||
 | 
					            return sb.ToString();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ColumnInfo _identCol;
 | 
				
			||||||
 | 
					        protected override long RawExecuteIdentity()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = this.ToSql();
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(sql)) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            long ret = 0;
 | 
				
			||||||
 | 
					            Exception exception = null;
 | 
				
			||||||
 | 
					            Aop.CurdBeforeEventArgs before = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_identCol == null || _source.Count > 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
 | 
				
			||||||
 | 
					                _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ret = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception ex)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    exception = ex;
 | 
				
			||||||
 | 
					                    throw ex;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                finally
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
				
			||||||
 | 
					                    _orm.Aop.CurdAfterHandler?.Invoke(this, after);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name);
 | 
				
			||||||
 | 
					            var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0);
 | 
				
			||||||
 | 
					            identParam.Direction = ParameterDirection.Output;
 | 
				
			||||||
 | 
					            sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}";
 | 
				
			||||||
 | 
					            var dbParms = _params.Concat(new[] { identParam }).ToArray();
 | 
				
			||||||
 | 
					            before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, dbParms);
 | 
				
			||||||
 | 
					            _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
				
			||||||
 | 
					                long.TryParse(string.Concat(identParam.Value), out ret);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                exception = ex;
 | 
				
			||||||
 | 
					                throw ex;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            finally
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
				
			||||||
 | 
					                _orm.Aop.CurdAfterHandler?.Invoke(this, after);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override List<T1> RawExecuteInserted()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = this.ToSql();
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(sql)) return new List<T1>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var ret = _source.ToList();
 | 
				
			||||||
 | 
					            this.RawExecuteAffrows();
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if net40
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        public override Task<int> ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(500, 999);
 | 
				
			||||||
 | 
					        public override Task<long> ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(500, 999);
 | 
				
			||||||
 | 
					        public override Task<List<T1>> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(500, 999);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async protected override Task<long> RawExecuteIdentityAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = this.ToSql();
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(sql)) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            long ret = 0;
 | 
				
			||||||
 | 
					            Exception exception = null;
 | 
				
			||||||
 | 
					            Aop.CurdBeforeEventArgs before = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_identCol == null || _source.Count > 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
 | 
				
			||||||
 | 
					                _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ret = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception ex)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    exception = ex;
 | 
				
			||||||
 | 
					                    throw ex;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                finally
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
				
			||||||
 | 
					                    _orm.Aop.CurdAfterHandler?.Invoke(this, after);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var identColName = _commonUtils.QuoteSqlName(_identCol.Attribute.Name);
 | 
				
			||||||
 | 
					            var identParam = _commonUtils.AppendParamter(null, $"{_identCol.CsName}99", _identCol, _identCol.Attribute.MapType, 0);
 | 
				
			||||||
 | 
					            identParam.Direction = ParameterDirection.Output;
 | 
				
			||||||
 | 
					            sql = $"{sql} RETURNING {identColName} INTO {identParam.ParameterName}";
 | 
				
			||||||
 | 
					            var dbParms = _params.Concat(new[] { identParam }).ToArray();
 | 
				
			||||||
 | 
					            before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, dbParms);
 | 
				
			||||||
 | 
					            _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
				
			||||||
 | 
					                long.TryParse(string.Concat(identParam.Value), out ret);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                exception = ex;
 | 
				
			||||||
 | 
					                throw ex;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            finally
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
				
			||||||
 | 
					                _orm.Aop.CurdAfterHandler?.Invoke(this, after);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        async protected override Task<List<T1>> RawExecuteInsertedAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = this.ToSql();
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(sql)) return new List<T1>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var ret = _source.ToList();
 | 
				
			||||||
 | 
					            await this.RawExecuteAffrowsAsync();
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										184
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,184 @@
 | 
				
			|||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Linq.Expressions;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng.Curd
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1> where T1 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal static string ToSqlStatic(CommonUtils _commonUtils, CommonExpression _commonExpression, string _select, bool _distinct, string field, StringBuilder _join, StringBuilder _where, string _groupby, string _having, string _orderby, int _skip, int _limit, List<SelectTableInfo> _tables, List<Dictionary<Type, string>> tbUnions, Func<Type, string, string> _aliasRule, string _tosqlAppendContent, List<LambdaExpression> _whereCascadeExpression, IFreeSql _orm)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_orm.CodeFirst.IsAutoSyncStructure)
 | 
				
			||||||
 | 
					                _orm.CodeFirst.SyncStructure(_tables.Select(a => a.Table.Type).ToArray());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_whereCascadeExpression.Any())
 | 
				
			||||||
 | 
					                foreach (var tb in _tables.Where(a => a.Type != SelectTableInfoType.Parent))
 | 
				
			||||||
 | 
					                    tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereCascadeExpression);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
 | 
					            var tbUnionsGt0 = tbUnions.Count > 1;
 | 
				
			||||||
 | 
					            for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (tbUnionsIdx > 0) sb.Append(" \r\n\r\nUNION ALL\r\n\r\n");
 | 
				
			||||||
 | 
					                if (tbUnionsGt0) sb.Append(_select).Append(" * from (");
 | 
				
			||||||
 | 
					                var tbUnion = tbUnions[tbUnionsIdx];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var sbnav = new StringBuilder();
 | 
				
			||||||
 | 
					                sb.Append(_select);
 | 
				
			||||||
 | 
					                if (_distinct) sb.Append("DISTINCT ");
 | 
				
			||||||
 | 
					                sb.Append(field);
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\"");
 | 
				
			||||||
 | 
					                sb.Append(" \r\nFROM ");
 | 
				
			||||||
 | 
					                var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
 | 
				
			||||||
 | 
					                var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
 | 
				
			||||||
 | 
					                for (var a = 0; a < tbsfrom.Length; a++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);
 | 
				
			||||||
 | 
					                    if (tbsjoin.Length > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
 | 
				
			||||||
 | 
					                        for (var b = 1; b < tbsfrom.Length; b++)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1");
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On;
 | 
				
			||||||
 | 
					                                sb.Append(" ON ").Append(onSql);
 | 
				
			||||||
 | 
					                                if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade);
 | 
				
			||||||
 | 
					                                    else sb.Append(" AND (").Append(tbsfrom[b].Cascade).Append(")");
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (!string.IsNullOrEmpty(tbsfrom[a].NavigateCondition)) sbnav.Append(" AND (").Append(tbsfrom[a].NavigateCondition).Append(")");
 | 
				
			||||||
 | 
					                        if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")");
 | 
				
			||||||
 | 
					                        if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND (").Append(tbsfrom[a].Cascade).Append(")");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (a < tbsfrom.Length - 1) sb.Append(", ");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                foreach (var tb in tbsjoin)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (tb.Type == SelectTableInfoType.Parent) continue;
 | 
				
			||||||
 | 
					                    switch (tb.Type)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        case SelectTableInfoType.LeftJoin:
 | 
				
			||||||
 | 
					                            sb.Append(" \r\nLEFT JOIN ");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case SelectTableInfoType.InnerJoin:
 | 
				
			||||||
 | 
					                            sb.Append(" \r\nINNER JOIN ");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case SelectTableInfoType.RightJoin:
 | 
				
			||||||
 | 
					                            sb.Append(" \r\nRIGHT JOIN ");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);
 | 
				
			||||||
 | 
					                    if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND (").Append(tb.Cascade).Append(")");
 | 
				
			||||||
 | 
					                    if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (_join.Length > 0) sb.Append(_join);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                sbnav.Append(_where);
 | 
				
			||||||
 | 
					                if (!string.IsNullOrEmpty(_tables[0].Cascade))
 | 
				
			||||||
 | 
					                    sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
 | 
				
			||||||
 | 
					                    sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
 | 
				
			||||||
 | 
					                if (sbnav.Length > 0)
 | 
				
			||||||
 | 
					                    sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(_groupby) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sb.Append(_groupby);
 | 
				
			||||||
 | 
					                    if (string.IsNullOrEmpty(_having) == false)
 | 
				
			||||||
 | 
					                        sb.Append(" \r\nHAVING ").Append(_having.Substring(5));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Append(_orderby);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(_orderby))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (_skip > 0)
 | 
				
			||||||
 | 
					                        sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
 | 
				
			||||||
 | 
					                    else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip);
 | 
				
			||||||
 | 
					                    else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                sbnav.Clear();
 | 
				
			||||||
 | 
					                if (tbUnionsGt0) sb.Append(") ftb");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return sb.Append(_tosqlAppendContent).ToString();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2> From<T2>(Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3> From<T2, T3>(Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4> From<T2, T3, T4>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5, T6>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5, T6, T7>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); DamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    class DamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
 | 
					        public override string ToSql(string field = null) => DamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										77
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengUpdate.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Providers/FreeSql.Provider.Dameng/Curd/DamengUpdate.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng.Curd
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengUpdate<T1> : Internal.CommonProvider.UpdateProvider<T1> where T1 : class
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DamengUpdate(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
 | 
				
			||||||
 | 
					            : base(orm, commonUtils, commonExpression, dywhere)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 200, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
 | 
				
			||||||
 | 
					        public override List<T1> ExecuteUpdated() => base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 200, _batchParameterLimit > 0 ? _batchParameterLimit : 999);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override List<T1> RawExecuteUpdated()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw new NotImplementedException();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_table.Primarys.Length == 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var pk = _table.Primarys.First();
 | 
				
			||||||
 | 
					                caseWhen.Append(_commonUtils.QuoteReadColumn(pk.CsType, pk.Attribute.MapType, _commonUtils.QuoteSqlName(pk.Attribute.Name)));
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            caseWhen.Append("(");
 | 
				
			||||||
 | 
					            var pkidx = 0;
 | 
				
			||||||
 | 
					            foreach (var pk in _table.Primarys)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (pkidx > 0) caseWhen.Append(" || '+' || ");
 | 
				
			||||||
 | 
					                caseWhen.Append(_commonUtils.QuoteReadColumn(pk.CsType, pk.Attribute.MapType, _commonUtils.QuoteSqlName(pk.Attribute.Name)));
 | 
				
			||||||
 | 
					                ++pkidx;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            caseWhen.Append(")");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void ToSqlWhen(StringBuilder sb, ColumnInfo[] primarys, object d)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_table.Primarys.Length == 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                sb.Append(_commonUtils.FormatSql("{0}", _table.Primarys.First().GetMapValue(d)));
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            sb.Append("(");
 | 
				
			||||||
 | 
					            var pkidx = 0;
 | 
				
			||||||
 | 
					            foreach (var pk in _table.Primarys)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (pkidx > 0) sb.Append(" || '+' || ");
 | 
				
			||||||
 | 
					                sb.Append(_commonUtils.FormatSql("{0}", pk.GetMapValue(d)));
 | 
				
			||||||
 | 
					                ++pkidx;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            sb.Append(")");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if net40
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        public override Task<int> ExecuteAffrowsAsync() => base.SplitExecuteAffrowsAsync(200, 999);
 | 
				
			||||||
 | 
					        public override Task<List<T1>> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override Task<List<T1>> RawExecuteUpdatedAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw new NotImplementedException();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										75
									
								
								Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					using Dm;
 | 
				
			||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using FreeSql.Internal.ObjectPool;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Threading;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class DamengAdo : FreeSql.Internal.CommonProvider.AdoProvider
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengAdo() : base(DataType.Dameng, null, null) { }
 | 
				
			||||||
 | 
					        public DamengAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings, Func<DbConnection> connectionFactory) : base(DataType.Dameng, masterConnectionString, slaveConnectionStrings)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            base._util = util;
 | 
				
			||||||
 | 
					            if (connectionFactory != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                MasterPool = new FreeSql.Internal.CommonProvider.DbConnectionPool(DataType.Dameng, connectionFactory);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (!string.IsNullOrEmpty(masterConnectionString))
 | 
				
			||||||
 | 
					                MasterPool = new DamengConnectionPool("主库", masterConnectionString, null, null);
 | 
				
			||||||
 | 
					            if (slaveConnectionStrings != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                foreach (var slaveConnectionString in slaveConnectionStrings)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var slavePool = new DamengConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
				
			||||||
 | 
					                    SlavePools.Add(slavePool);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override object AddslashesProcessParam(object param, Type mapType, ColumnInfo mapColumn)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (param == null) return "NULL";
 | 
				
			||||||
 | 
					            if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false))
 | 
				
			||||||
 | 
					                param = Utils.GetDataReaderValue(mapType, param);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (param is byte[])
 | 
				
			||||||
 | 
					                return $"hextoraw('{CommonUtils.BytesSqlRaw(param as byte[])}')";
 | 
				
			||||||
 | 
					            else if (param is bool || param is bool?)
 | 
				
			||||||
 | 
					                return (bool)param ? 1 : 0;
 | 
				
			||||||
 | 
					            else if (param is string || param is char)
 | 
				
			||||||
 | 
					                return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
 | 
					            else if (param is Enum)
 | 
				
			||||||
 | 
					                return ((Enum)param).ToInt64();
 | 
				
			||||||
 | 
					            else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
				
			||||||
 | 
					                return param;
 | 
				
			||||||
 | 
					            else if (param is DateTime || param is DateTime?)
 | 
				
			||||||
 | 
					                return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
 | 
				
			||||||
 | 
					            else if (param is TimeSpan || param is TimeSpan?)
 | 
				
			||||||
 | 
					                return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')";
 | 
				
			||||||
 | 
					            else if (param is IEnumerable)
 | 
				
			||||||
 | 
					                return AddslashesIEnumerable(param, mapType, mapColumn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
				
			||||||
 | 
					            //if (param is string) return string.Concat('N', nparms[a]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override DbCommand CreateCommand()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return new DmCommand();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void ReturnConnection(IObjectPool<DbConnection> pool, Object<DbConnection> conn, Exception ex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var rawPool = pool as DamengConnectionPool;
 | 
				
			||||||
 | 
					            if (rawPool != null) rawPool.Return(conn, ex);
 | 
				
			||||||
 | 
					            else pool.Return(conn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override DbParameter[] GetDbParamtersByObject(string sql, object obj) => _util.GetDbParamtersByObject(sql, obj);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,253 @@
 | 
				
			|||||||
 | 
					using Dm;
 | 
				
			||||||
 | 
					using FreeSql.Internal.ObjectPool;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Concurrent;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengConnectionPool : ObjectPool<DbConnection>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal Action availableHandler;
 | 
				
			||||||
 | 
					        internal Action unavailableHandler;
 | 
				
			||||||
 | 
					        internal string UserId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DamengConnectionPool(string name, string connectionString, Action availableHandler, Action unavailableHandler) : base(null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.UserId = DamengConnectionPool.GetUserId(connectionString);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.availableHandler = availableHandler;
 | 
				
			||||||
 | 
					            this.unavailableHandler = unavailableHandler;
 | 
				
			||||||
 | 
					            var policy = new DamengConnectionPoolPolicy
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _pool = this,
 | 
				
			||||||
 | 
					                Name = name
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            this.Policy = policy;
 | 
				
			||||||
 | 
					            policy.ConnectionString = connectionString;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static string GetUserId(string connectionString)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var userIdMatch = Regex.Match(connectionString, @"(User\s+Id|Uid)\s*=\s*([^;]+)", RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					            if (userIdMatch.Success == false) throw new Exception(@"从 ConnectionString 中无法匹配 (User\s+Id|Uid)\s*=\s*([^;]+)");
 | 
				
			||||||
 | 
					            return userIdMatch.Groups[2].Value.Trim().ToUpper();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void Return(Object<DbConnection> obj, Exception exception, bool isRecreate = false)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (exception != null && exception is DmException)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (exception is System.IO.IOException)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    base.SetUnavailable(exception);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else if (obj.Value.Ping() == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    base.SetUnavailable(exception);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            base.Return(obj, isRecreate);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengConnectionPoolPolicy : IPolicy<DbConnection>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal DamengConnectionPool _pool;
 | 
				
			||||||
 | 
					        public string Name { get; set; } = "Dameng DmConnection 对象池";
 | 
				
			||||||
 | 
					        public int PoolSize { get; set; } = 100;
 | 
				
			||||||
 | 
					        public TimeSpan SyncGetTimeout { get; set; } = TimeSpan.FromSeconds(10);
 | 
				
			||||||
 | 
					        public TimeSpan IdleTimeout { get; set; } = TimeSpan.FromSeconds(20);
 | 
				
			||||||
 | 
					        public int AsyncGetCapacity { get; set; } = 10000;
 | 
				
			||||||
 | 
					        public bool IsThrowGetTimeoutException { get; set; } = true;
 | 
				
			||||||
 | 
					        public bool IsAutoDisposeWithSystem { get; set; } = true;
 | 
				
			||||||
 | 
					        public int CheckAvailableInterval { get; set; } = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static ConcurrentDictionary<string, int> dicConnStrIncr = new ConcurrentDictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
 | 
					        private string _connectionString;
 | 
				
			||||||
 | 
					        public string ConnectionString
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get => _connectionString;
 | 
				
			||||||
 | 
					            set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connectionString = value ?? "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var pattern = @"(Max\s*)?pool\s*size\s*=\s*(\d+)";
 | 
				
			||||||
 | 
					                Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
 | 
				
			||||||
 | 
					                var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
 | 
				
			||||||
 | 
					                PoolSize = poolsize + connStrIncr;
 | 
				
			||||||
 | 
					                _connectionString = m.Success ?
 | 
				
			||||||
 | 
					                    Regex.Replace(_connectionString, pattern, $"poolsize={PoolSize}", RegexOptions.IgnoreCase) :
 | 
				
			||||||
 | 
					                    $"{_connectionString};poolsize={PoolSize}"; //NotSupportedException
 | 
				
			||||||
 | 
					                //if (m.Success) _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                pattern = @"Connection\s*LifeTime\s*=\s*(\d+)";
 | 
				
			||||||
 | 
					                m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                if (m.Success)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    IdleTimeout = TimeSpan.FromSeconds(int.Parse(m.Groups[1].Value));
 | 
				
			||||||
 | 
					                    _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var minPoolSize = 0;
 | 
				
			||||||
 | 
					                pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
 | 
				
			||||||
 | 
					                m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                if (m.Success)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    minPoolSize = int.Parse(m.Groups[1].Value);
 | 
				
			||||||
 | 
					                    _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool OnCheckAvailable(Object<DbConnection> obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
 | 
				
			||||||
 | 
					            return obj.Value.Ping(true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DbConnection OnCreate()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var conn = new DmConnection(_connectionString);
 | 
				
			||||||
 | 
					            return conn;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnDestroy(DbConnection obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (obj.State != ConnectionState.Closed) obj.Close();
 | 
				
			||||||
 | 
					            obj.Dispose();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnGet(Object<DbConnection> obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_pool.IsAvailable)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (obj.Value == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (_pool.SetUnavailable(new Exception("连接字符串错误")) == true)
 | 
				
			||||||
 | 
					                        throw new Exception($"【{this.Name}】连接字符串错误,请检查。");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && obj.Value.Ping() == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        obj.Value.Open();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    catch (Exception ex)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (_pool.SetUnavailable(ex) == true)
 | 
				
			||||||
 | 
					                            throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if net40
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        async public Task OnGetAsync(Object<DbConnection> obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_pool.IsAvailable)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (obj.Value == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (_pool.SetUnavailable(new Exception("连接字符串错误")) == true)
 | 
				
			||||||
 | 
					                        throw new Exception($"【{this.Name}】连接字符串错误,请检查。");
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        await obj.Value.OpenAsync();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    catch (Exception ex)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (_pool.SetUnavailable(ex) == true)
 | 
				
			||||||
 | 
					                            throw new Exception($"【{this.Name}】状态不可用,等待后台检查程序恢复方可使用。{ex.Message}");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnGetTimeout()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnReturn(Object<DbConnection> obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //if (obj?.Value != null && obj.Value.State != ConnectionState.Closed) try { obj.Value.Close(); } catch { }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnAvailable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _pool.availableHandler?.Invoke();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void OnUnavailable()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _pool.unavailableHandler?.Invoke();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static class DbConnectionExtensions
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static DbCommand PingCommand(DbConnection conn)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var cmd = conn.CreateCommand();
 | 
				
			||||||
 | 
					            cmd.CommandTimeout = 5;
 | 
				
			||||||
 | 
					            cmd.CommandText = "select 1 from dual";
 | 
				
			||||||
 | 
					            return cmd;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public static bool Ping(this DbConnection that, bool isThrow = false)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                PingCommand(that).ExecuteNonQuery();
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (that.State != ConnectionState.Closed) try { that.Close(); } catch { }
 | 
				
			||||||
 | 
					                if (isThrow) throw;
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if net40
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        async public static Task<bool> PingAsync(this DbConnection that, bool isThrow = false)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                await PingCommand(that).ExecuteNonQueryAsync();
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (that.State != ConnectionState.Closed) try { that.Close(); } catch { }
 | 
				
			||||||
 | 
					                if (isThrow) throw;
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										469
									
								
								Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										469
									
								
								Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,469 @@
 | 
				
			|||||||
 | 
					using Dm;
 | 
				
			||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Reflection;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengCodeFirst : Internal.CommonProvider.CodeFirstProvider
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public override bool IsNoneCommandParameter { get => true; set => base.IsNoneCommandParameter = true; }
 | 
				
			||||||
 | 
					        public DamengCodeFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) : base(orm, commonUtils, commonExpression) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static object _dicCsToDbLock = new object();
 | 
				
			||||||
 | 
					        static Dictionary<string, CsToDb<DmDbType>> _dicCsToDb = new Dictionary<string, CsToDb<DmDbType>>() {
 | 
				
			||||||
 | 
					                { typeof(bool).FullName, CsToDb.New(DmDbType.Bit, "number","number(1) NOT NULL", null, false, false) },{ typeof(bool?).FullName, CsToDb.New(DmDbType.Bit, "number","number(1) NULL", null, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { typeof(sbyte).FullName, CsToDb.New(DmDbType.SByte, "number", "number(4) NOT NULL", false, false, 0) },{ typeof(sbyte?).FullName, CsToDb.New(DmDbType.SByte, "number", "number(4) NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(short).FullName, CsToDb.New(DmDbType.Int16, "number","number(6) NOT NULL", false, false, 0) },{ typeof(short?).FullName, CsToDb.New(DmDbType.Int16, "number", "number(6) NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(int).FullName, CsToDb.New(DmDbType.Int32, "number", "number(11) NOT NULL", false, false, 0) },{ typeof(int?).FullName, CsToDb.New(DmDbType.Int32, "number", "number(11) NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(long).FullName, CsToDb.New(DmDbType.Int64, "number","number(21) NOT NULL", false, false, 0) },{ typeof(long?).FullName, CsToDb.New(DmDbType.Int64, "number","number(21) NULL", false, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { typeof(byte).FullName, CsToDb.New(DmDbType.Byte, "number","number(3) NOT NULL", true, false, 0) },{ typeof(byte?).FullName, CsToDb.New(DmDbType.Byte, "number","number(3) NULL", true, true, null) },
 | 
				
			||||||
 | 
					                { typeof(ushort).FullName, CsToDb.New(DmDbType.UInt16, "number","number(5) NOT NULL", true, false, 0) },{ typeof(ushort?).FullName, CsToDb.New(DmDbType.UInt16, "number", "number(5) NULL", true, true, null) },
 | 
				
			||||||
 | 
					                { typeof(uint).FullName, CsToDb.New(DmDbType.UInt32, "number", "number(10) NOT NULL", true, false, 0) },{ typeof(uint?).FullName, CsToDb.New(DmDbType.UInt32, "number", "number(10) NULL", true, true, null) },
 | 
				
			||||||
 | 
					                { typeof(ulong).FullName, CsToDb.New(DmDbType.UInt64, "number", "number(20) NOT NULL", true, false, 0) },{ typeof(ulong?).FullName, CsToDb.New(DmDbType.UInt64, "number", "number(20) NULL", true, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { typeof(double).FullName, CsToDb.New(DmDbType.Double, "double", "double NOT NULL", false, false, 0) },{ typeof(double?).FullName, CsToDb.New(DmDbType.Double, "double", "double NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(float).FullName, CsToDb.New(DmDbType.Float, "real","real NOT NULL", false, false, 0) },{ typeof(float?).FullName, CsToDb.New(DmDbType.Float, "real","real NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(decimal).FullName, CsToDb.New(DmDbType.Decimal, "number", "number(10,2) NOT NULL", false, false, 0) },{ typeof(decimal?).FullName, CsToDb.New(DmDbType.Decimal, "number", "number(10,2) NULL", false, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //达梦8 ODBC 不支持 TimeSpan
 | 
				
			||||||
 | 
					                //{ typeof(TimeSpan).FullName, CsToDb.NewInfo(DmDbType.Time, "interval day to second","interval day(2) to second(6) NOT NULL", false, false, 0) },{ typeof(TimeSpan?).FullName,  (DmDbType.Time, "interval day to second", "interval day(2) to second(6) NULL",false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(DateTime).FullName, CsToDb.New(DmDbType.DateTime, "timestamp", "timestamp(6) NOT NULL", false, false, new DateTime(1970,1,1)) },{ typeof(DateTime?).FullName, CsToDb.New(DmDbType.DateTime, "timestamp", "timestamp(6) NULL", false, true, null) },
 | 
				
			||||||
 | 
					                { typeof(DateTimeOffset).FullName, CsToDb.New(DmDbType.DateTime, "timestamp", "timestamp(6) NOT NULL", false, false, new DateTime(1970,1,1)) },{ typeof(DateTimeOffset?).FullName, CsToDb.New(DmDbType.DateTime, "timestamp", "timestamp(6) NULL", false, true, null) },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { typeof(byte[]).FullName, CsToDb.New(DmDbType.VarBinary, "blob", "blob NULL", false, null, new byte[0]) },
 | 
				
			||||||
 | 
					                { typeof(string).FullName, CsToDb.New(DmDbType.VarChar, "nvarchar2", "nvarchar2(255) NULL", false, null, "") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { typeof(Guid).FullName, CsToDb.New(DmDbType.Char, "char", "char(36) NOT NULL", false, false, Guid.Empty) },{ typeof(Guid?).FullName, CsToDb.New(DmDbType.Char, "char", "char(36) NULL", false, true, null) },
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override DbInfoResult GetDbInfo(Type type)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new DbInfoResult((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue);
 | 
				
			||||||
 | 
					            if (type.IsArray) return null;
 | 
				
			||||||
 | 
					            var enumType = type.IsEnum ? type : null;
 | 
				
			||||||
 | 
					            if (enumType == null && type.IsNullableType())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var genericTypes = type.GetGenericArguments();
 | 
				
			||||||
 | 
					                if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (enumType != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ?
 | 
				
			||||||
 | 
					                    CsToDb.New(DmDbType.Int32, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0)) :
 | 
				
			||||||
 | 
					                    CsToDb.New(DmDbType.Int64, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, Enum.GetValues(enumType).GetValue(0));
 | 
				
			||||||
 | 
					                if (_dicCsToDb.ContainsKey(type.FullName) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    lock (_dicCsToDbLock)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (_dicCsToDb.ContainsKey(type.FullName) == false)
 | 
				
			||||||
 | 
					                            _dicCsToDb.Add(type.FullName, newItem);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return new DbInfoResult((int)newItem.type, newItem.dbtype, newItem.dbtypeFull, newItem.isnullable, newItem.defaultValue);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override string GetComparisonDDLStatements(params TypeAndName[] objects)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var userId = (_orm.Ado.MasterPool as DamengConnectionPool)?.UserId;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(userId))
 | 
				
			||||||
 | 
					                using (var conn = _orm.Ado.MasterPool.Get())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    userId = DamengConnectionPool.GetUserId(conn.Value.ConnectionString);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            var seqcols = new List<NaviteTuple<ColumnInfo, string[], bool>>(); //序列:列,表,自增
 | 
				
			||||||
 | 
					            var seqnameDel = new List<string>(); //要删除的序列+触发器
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sb = new StringBuilder();
 | 
				
			||||||
 | 
					            var sbDeclare = new StringBuilder();
 | 
				
			||||||
 | 
					            foreach (var obj in objects)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (sb.Length > 0) sb.Append("\r\n");
 | 
				
			||||||
 | 
					                var tb = _commonUtils.GetTableByEntity(obj.entityType);
 | 
				
			||||||
 | 
					                if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
 | 
				
			||||||
 | 
					                if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移,可迁移属性0个");
 | 
				
			||||||
 | 
					                var tbname = _commonUtils.SplitTableName(tb.DbName);
 | 
				
			||||||
 | 
					                if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //旧表名
 | 
				
			||||||
 | 
					                if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] };
 | 
				
			||||||
 | 
					                var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name;
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(obj.tableName) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var tbtmpname = _commonUtils.SplitTableName(obj.tableName);
 | 
				
			||||||
 | 
					                    if (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] };
 | 
				
			||||||
 | 
					                    if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        tbname = tbtmpname;
 | 
				
			||||||
 | 
					                        tboldname = null;
 | 
				
			||||||
 | 
					                        primaryKeyName = null;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //codefirst 不支持表名中带 .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库
 | 
				
			||||||
 | 
					                    throw new NotImplementedException($"达梦 CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var sbalter = new StringBuilder();
 | 
				
			||||||
 | 
					                var istmpatler = false; //创建临时表,导入数据,删除旧表,修改
 | 
				
			||||||
 | 
					                if (_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from all_tab_comments where owner={0} and table_name={1}", tbname)) == null)
 | 
				
			||||||
 | 
					                { //表不存在
 | 
				
			||||||
 | 
					                    if (tboldname != null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from all_tab_comments where owner={0} and table_name={1}", tboldname)) == null)
 | 
				
			||||||
 | 
					                            //模式或表不存在
 | 
				
			||||||
 | 
					                            tboldname = null;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (tboldname == null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        //创建表
 | 
				
			||||||
 | 
					                        var createTableName = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}");
 | 
				
			||||||
 | 
					                        sb.Append("execute immediate 'CREATE TABLE ").Append(createTableName).Append(" ( ");
 | 
				
			||||||
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
 | 
					                            if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (tb.Primarys.Any())
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk1";
 | 
				
			||||||
 | 
					                            sb.Append(" \r\n  CONSTRAINT ").Append(_commonUtils.QuoteSqlName(pkname)).Append(" PRIMARY KEY (");
 | 
				
			||||||
 | 
					                            foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
				
			||||||
 | 
					                            sb.Remove(sb.Length - 2, 2).Append("),");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        sb.Remove(sb.Length - 1, 1);
 | 
				
			||||||
 | 
					                        sb.Append("\r\n) LOGGING ';\r\n");
 | 
				
			||||||
 | 
					                        //创建表的索引
 | 
				
			||||||
 | 
					                        foreach (var uk in tb.Indexes)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            sb.Append("execute immediate 'CREATE ");
 | 
				
			||||||
 | 
					                            if (uk.IsUnique) sb.Append("UNIQUE ");
 | 
				
			||||||
 | 
					                            sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(createTableName).Append("(");
 | 
				
			||||||
 | 
					                            foreach (var tbcol in uk.Columns)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
				
			||||||
 | 
					                                if (tbcol.IsDesc) sb.Append(" DESC");
 | 
				
			||||||
 | 
					                                sb.Append(", ");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            sb.Remove(sb.Length - 2, 2).Append(")';\r\n");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        //备注
 | 
				
			||||||
 | 
					                        foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (string.IsNullOrEmpty(tbcol.Comment) == false)
 | 
				
			||||||
 | 
					                                sb.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment).Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (string.IsNullOrEmpty(tb.Comment) == false)
 | 
				
			||||||
 | 
					                            sb.Append("execute immediate 'COMMENT ON TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tb.Comment).Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    //如果新表,旧表在一个模式下,直接修改表名
 | 
				
			||||||
 | 
					                    if (string.Compare(tbname[0], tboldname[0], true) == 0)
 | 
				
			||||||
 | 
					                        sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}")).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}")).Append("';\r\n");
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        //如果新表,旧表不在一起,创建新表,导入数据,删除旧表
 | 
				
			||||||
 | 
					                        istmpatler = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    tboldname = null; //如果新表已经存在,不走改表名逻辑
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段
 | 
				
			||||||
 | 
					                var sql = _commonUtils.FormatSql($@"
 | 
				
			||||||
 | 
					select 
 | 
				
			||||||
 | 
					a.column_name,
 | 
				
			||||||
 | 
					a.data_type,
 | 
				
			||||||
 | 
					a.data_length,
 | 
				
			||||||
 | 
					a.data_precision,
 | 
				
			||||||
 | 
					a.data_scale,
 | 
				
			||||||
 | 
					a.char_used,
 | 
				
			||||||
 | 
					case when a.nullable = 'N' then 0 else 1 end,
 | 
				
			||||||
 | 
					nvl((select 1 from user_sequences where upper(sequence_name)=upper('{Utils.GetCsName((tboldname ?? tbname).Last())}_seq_'||a.column_name) and rownum < 2), 0),
 | 
				
			||||||
 | 
					nvl((select 1 from user_triggers where upper(trigger_name)=upper('{Utils.GetCsName((tboldname ?? tbname).Last())}_seq_'||a.column_name||'TI') and rownum < 2), 0),
 | 
				
			||||||
 | 
					b.comments
 | 
				
			||||||
 | 
					from all_tab_columns a
 | 
				
			||||||
 | 
					left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
				
			||||||
 | 
					where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			||||||
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					                var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var sqlType = GetDamengSqlTypeFullName(a);
 | 
				
			||||||
 | 
					                    return new
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        column = string.Concat(a[0]),
 | 
				
			||||||
 | 
					                        sqlType,
 | 
				
			||||||
 | 
					                        is_nullable = string.Concat(a[6]) == "1",
 | 
				
			||||||
 | 
					                        is_identity = string.Concat(a[7]) == "1" && string.Concat(a[8]) == "1",
 | 
				
			||||||
 | 
					                        comment = string.Concat(a[9])
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					                }, StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (istmpatler == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        var dbtypeNoneNotNull = Regex.Replace(tbcol.Attribute.DbType, @"NOT\s+NULL", "NULL");
 | 
				
			||||||
 | 
					                        if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) ||
 | 
				
			||||||
 | 
					                            string.IsNullOrEmpty(tbcol.Attribute.OldName) == false && tbstruct.TryGetValue(tbcol.Attribute.OldName, out tbstructcol))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var isCommentChanged = tbstructcol.comment != (tbcol.Comment ?? "");
 | 
				
			||||||
 | 
					                            if (tbcol.Attribute.DbType.StartsWith(tbstructcol.sqlType, StringComparison.CurrentCultureIgnoreCase) == false)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                istmpatler = true;
 | 
				
			||||||
 | 
					                                if (istmpatler && tbcol.Attribute.DbType.StartsWith("varchar", StringComparison.CurrentCultureIgnoreCase) && tbstructcol.sqlType.StartsWith("varchar2", StringComparison.CurrentCultureIgnoreCase)
 | 
				
			||||||
 | 
					                                    && Regex.Match(tbcol.Attribute.DbType, @"\(\d+").Groups[0].Value == Regex.Match(tbstructcol.sqlType, @"\(\d+").Groups[0].Value)
 | 
				
			||||||
 | 
					                                    istmpatler = false;
 | 
				
			||||||
 | 
					                                if (istmpatler && Regex.IsMatch(tbcol.Attribute.DbType, @"\(\d+") == false && Regex.IsMatch(tbstructcol.sqlType, @"\(\d+")
 | 
				
			||||||
 | 
					                                    && string.Compare(tbcol.Attribute.DbType, Regex.Replace(tbstructcol.sqlType, @"\([^\)]+\)", ""), StringComparison.CurrentCultureIgnoreCase) == 0)
 | 
				
			||||||
 | 
					                                    istmpatler = false;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            //sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY (").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(dbtypeNoneNotNull).Append(")';\r\n");
 | 
				
			||||||
 | 
					                            if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (tbcol.Attribute.IsNullable == false)
 | 
				
			||||||
 | 
					                                    sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append(" WHERE ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" IS NULL';\r\n");
 | 
				
			||||||
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" ").Append(tbcol.Attribute.IsNullable == true ? "" : "NOT").Append(" NULL';\r\n");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            if (string.Compare(tbstructcol.column, tbcol.Attribute.OldName, true) == 0)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (tbstructcol.is_identity)
 | 
				
			||||||
 | 
					                                    seqnameDel.Add(Utils.GetCsName($"{tbname[1]}_seq_{tbstructcol.column}"));
 | 
				
			||||||
 | 
					                                //修改列名
 | 
				
			||||||
 | 
					                                sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" RENAME COLUMN ").Append(_commonUtils.QuoteSqlName(tbstructcol.column)).Append(" TO ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append("';\r\n");
 | 
				
			||||||
 | 
					                                if (tbcol.Attribute.IsIdentity)
 | 
				
			||||||
 | 
					                                    seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else if (tbcol.Attribute.IsIdentity != tbstructcol.is_identity)
 | 
				
			||||||
 | 
					                                seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
 | 
					                            if (isCommentChanged)
 | 
				
			||||||
 | 
					                                sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                            continue;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        //添加列
 | 
				
			||||||
 | 
					                        sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ADD (").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(dbtypeNoneNotNull).Append(")';\r\n");
 | 
				
			||||||
 | 
					                        if (tbcol.Attribute.IsNullable == false)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            sbalter.Append("execute immediate 'UPDATE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" SET ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" = ").Append(tbcol.DbDefaultValue.Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                            sbalter.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" MODIFY ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" NOT NULL';\r\n");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true));
 | 
				
			||||||
 | 
					                        if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment ?? "").Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var dsuksql = _commonUtils.FormatSql(@"
 | 
				
			||||||
 | 
					select
 | 
				
			||||||
 | 
					c.column_name,
 | 
				
			||||||
 | 
					a.index_name,
 | 
				
			||||||
 | 
					case when c.descend = 'DESC' then 1 else 0 end,
 | 
				
			||||||
 | 
					case when a.uniqueness = 'UNIQUE' then 1 else 0 end
 | 
				
			||||||
 | 
					from all_indexes a,
 | 
				
			||||||
 | 
					all_ind_columns c 
 | 
				
			||||||
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
 | 
					and a.owner in ({0}) and a.table_name in ({1})
 | 
				
			||||||
 | 
					and not exists(select 1 from all_constraints where index_name = a.index_name and constraint_type = 'P')", tboldname ?? tbname);
 | 
				
			||||||
 | 
					                    var dsuk = _orm.Ado.ExecuteArray(CommandType.Text, dsuksql).Select(a => new[] { string.Concat(a[0]).Trim('"'), string.Concat(a[1]), string.Concat(a[2]), string.Concat(a[3]) }).ToArray();
 | 
				
			||||||
 | 
					                    foreach (var uk in tb.Indexes)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (string.IsNullOrEmpty(uk.Name) || uk.Columns.Any() == false) continue;
 | 
				
			||||||
 | 
					                        var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray();
 | 
				
			||||||
 | 
					                        if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => uk.Columns.Where(b => (a[3] == "1") == uk.IsUnique && string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (dsukfind1.Any()) sbalter.Append("execute immediate 'DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append("';\r\n");
 | 
				
			||||||
 | 
					                            sbalter.Append("execute immediate 'CREATE ");
 | 
				
			||||||
 | 
					                            if (uk.IsUnique) sbalter.Append("UNIQUE ");
 | 
				
			||||||
 | 
					                            sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append("(");
 | 
				
			||||||
 | 
					                            foreach (var tbcol in uk.Columns)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
				
			||||||
 | 
					                                if (tbcol.IsDesc) sbalter.Append(" DESC");
 | 
				
			||||||
 | 
					                                sbalter.Append(", ");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            sbalter.Remove(sbalter.Length - 2, 2).Append(")';\r\n");
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (istmpatler == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select comments from all_tab_comments where owner = {0} and table_name = {1} and table_type = 'TABLE'", tbname[0], tbname[1])));
 | 
				
			||||||
 | 
					                    if (dbcomment != (tb.Comment ?? ""))
 | 
				
			||||||
 | 
					                        sb.Append("execute immediate 'COMMENT ON TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tb.Comment).Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    sb.Append(sbalter);
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select constraint_name from user_constraints where owner={0} and table_name={1} and constraint_type='P'", tbname))?.ToString();
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(oldpk) == false)
 | 
				
			||||||
 | 
					                    sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append("';\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名
 | 
				
			||||||
 | 
					                var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}");
 | 
				
			||||||
 | 
					                var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}");
 | 
				
			||||||
 | 
					                //创建临时表
 | 
				
			||||||
 | 
					                sb.Append("execute immediate 'CREATE TABLE ").Append(tmptablename).Append(" ( ");
 | 
				
			||||||
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sb.Append(" \r\n  ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(",");
 | 
				
			||||||
 | 
					                    if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NaviteTuple.Create(tbcol, tbname, true));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (tb.Primarys.Any())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk2";
 | 
				
			||||||
 | 
					                    sb.Append(" \r\n  CONSTRAINT ").Append(_commonUtils.QuoteSqlName(pkname)).Append(" PRIMARY KEY (");
 | 
				
			||||||
 | 
					                    foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
				
			||||||
 | 
					                    sb.Remove(sb.Length - 2, 2).Append("),");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Remove(sb.Length - 1, 1);
 | 
				
			||||||
 | 
					                sb.Append("\r\n) LOGGING ';\r\n");
 | 
				
			||||||
 | 
					                //备注
 | 
				
			||||||
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (string.IsNullOrEmpty(tbcol.Comment) == false)
 | 
				
			||||||
 | 
					                        sb.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment).Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(tb.Comment) == false)
 | 
				
			||||||
 | 
					                    sb.Append("execute immediate 'COMMENT ON TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tb.Comment).Replace("'", "''")).Append("';\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                sb.Append("execute immediate 'INSERT INTO ").Append(tmptablename).Append(" (");
 | 
				
			||||||
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                    sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", ");
 | 
				
			||||||
 | 
					                sb.Remove(sb.Length - 2, 2).Append(")\r\nSELECT ");
 | 
				
			||||||
 | 
					                foreach (var tbcol in tb.ColumnsByPosition)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var insertvalue = "NULL";
 | 
				
			||||||
 | 
					                    if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) ||
 | 
				
			||||||
 | 
					                        string.IsNullOrEmpty(tbcol.Attribute.OldName) == false && tbstruct.TryGetValue(tbcol.Attribute.OldName, out tbstructcol))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        insertvalue = _commonUtils.QuoteSqlName(tbstructcol.column);
 | 
				
			||||||
 | 
					                        if (tbcol.Attribute.DbType.StartsWith(tbstructcol.sqlType, StringComparison.CurrentCultureIgnoreCase) == false)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var dbtypeNoneNotNull = Regex.Replace(tbcol.Attribute.DbType, @"(NOT\s+)?NULL", "");
 | 
				
			||||||
 | 
					                            insertvalue = $"cast({insertvalue} as {dbtypeNoneNotNull})";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (tbcol.Attribute.IsNullable != tbstructcol.is_nullable)
 | 
				
			||||||
 | 
					                            insertvalue = $"nvl({insertvalue},{tbcol.DbDefaultValue})";
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (tbcol.Attribute.IsNullable == false)
 | 
				
			||||||
 | 
					                        insertvalue = tbcol.DbDefaultValue;
 | 
				
			||||||
 | 
					                    sb.Append(insertvalue.Replace("'", "''")).Append(", ");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Remove(sb.Length - 2, 2).Append(" FROM ").Append(tablename).Append("';\r\n");
 | 
				
			||||||
 | 
					                sb.Append("execute immediate 'DROP TABLE ").Append(tablename).Append("';\r\n");
 | 
				
			||||||
 | 
					                sb.Append("execute immediate 'ALTER TABLE ").Append(tmptablename).Append(" RENAME TO ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}")).Append("';\r\n");
 | 
				
			||||||
 | 
					                //创建表的索引
 | 
				
			||||||
 | 
					                foreach (var uk in tb.Indexes)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sb.Append("execute immediate 'CREATE ");
 | 
				
			||||||
 | 
					                    if (uk.IsUnique) sb.Append("UNIQUE ");
 | 
				
			||||||
 | 
					                    sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(tablename).Append("(");
 | 
				
			||||||
 | 
					                    foreach (var tbcol in uk.Columns)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name));
 | 
				
			||||||
 | 
					                        if (tbcol.IsDesc) sb.Append(" DESC");
 | 
				
			||||||
 | 
					                        sb.Append(", ");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    sb.Remove(sb.Length - 2, 2).Append(")';\r\n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Dictionary<string, bool> dicDeclare = new Dictionary<string, bool>();
 | 
				
			||||||
 | 
					            Action<string> dropSequence = seqname =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (dicDeclare.ContainsKey(seqname) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sbDeclare.Append("\r\nIS").Append(seqname).Append(" NUMBER; \r\n");
 | 
				
			||||||
 | 
					                    dicDeclare.Add(seqname, true);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Append("IS").Append(seqname).Append(" := 0; \r\n")
 | 
				
			||||||
 | 
					                    .Append(" select count(1) into IS").Append(seqname).Append(_commonUtils.FormatSql(" from user_sequences where sequence_name={0}; \r\n", seqname))
 | 
				
			||||||
 | 
					                    .Append("if IS").Append(seqname).Append(" > 0 then \r\n")
 | 
				
			||||||
 | 
					                    .Append("  execute immediate 'DROP SEQUENCE ").Append(_commonUtils.QuoteSqlName(seqname)).Append("';\r\n")
 | 
				
			||||||
 | 
					                    .Append("end if; \r\n");
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            Action<string> dropTrigger = tiggerName =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (dicDeclare.ContainsKey(tiggerName) == false)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sbDeclare.Append("\r\nIS").Append(tiggerName).Append(" NUMBER; \r\n");
 | 
				
			||||||
 | 
					                    dicDeclare.Add(tiggerName, true);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sb.Append("IS").Append(tiggerName).Append(" := 0; \r\n")
 | 
				
			||||||
 | 
					                    .Append(" select count(1) into IS").Append(tiggerName).Append(_commonUtils.FormatSql(" from user_triggers where trigger_name={0}; \r\n", tiggerName))
 | 
				
			||||||
 | 
					                    .Append("if IS").Append(tiggerName).Append(" > 0 then \r\n")
 | 
				
			||||||
 | 
					                    .Append("  execute immediate 'DROP TRIGGER ").Append(_commonUtils.QuoteSqlName(tiggerName)).Append("';\r\n")
 | 
				
			||||||
 | 
					                    .Append("end if; \r\n");
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            foreach (var seqname in seqnameDel)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                dropSequence(seqname);
 | 
				
			||||||
 | 
					                dropTrigger(seqname + "TI");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (var seqcol in seqcols)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var tbname = seqcol.Item2;
 | 
				
			||||||
 | 
					                var seqname = Utils.GetCsName($"{tbname[1]}_seq_{seqcol.Item1.Attribute.Name}").ToUpper();
 | 
				
			||||||
 | 
					                var tiggerName = seqname + "TI";
 | 
				
			||||||
 | 
					                var tbname2 = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}");
 | 
				
			||||||
 | 
					                var colname2 = _commonUtils.QuoteSqlName(seqcol.Item1.Attribute.Name);
 | 
				
			||||||
 | 
					                dropSequence(seqname);
 | 
				
			||||||
 | 
					                if (seqcol.Item3)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var startWith = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from all_tab_columns where owner={0} and table_name={1} and column_name={2}", tbname[0], tbname[1], seqcol.Item1.Attribute.Name)) == null ? 1 :
 | 
				
			||||||
 | 
					                        _orm.Ado.ExecuteScalar(CommandType.Text, $" select nvl(max({colname2})+1,1) from {tbname2}");
 | 
				
			||||||
 | 
					                    sb.Append("execute immediate 'CREATE SEQUENCE ").Append(_commonUtils.QuoteSqlName(seqname)).Append(" start with ").Append(startWith).Append("';\r\n");
 | 
				
			||||||
 | 
					                    sb.Append("execute immediate 'CREATE OR REPLACE TRIGGER ").Append(_commonUtils.QuoteSqlName(tiggerName))
 | 
				
			||||||
 | 
					                        .Append(" \r\nbefore insert on ").Append(tbname2)
 | 
				
			||||||
 | 
					                        .Append(" \r\nfor each row \r\nbegin\r\nselect ").Append(_commonUtils.QuoteSqlName(seqname))
 | 
				
			||||||
 | 
					                        .Append(".nextval into :new.").Append(colname2).Append(" from dual;\r\nend;';\r\n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    dropTrigger(tiggerName);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (sbDeclare.Length > 0) sbDeclare.Insert(0, "declare ");
 | 
				
			||||||
 | 
					            return sb.Length == 0 ? null : sb.Insert(0, "BEGIN \r\n").Insert(0, sbDeclare.ToString()).Append("END;").ToString();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal static string GetDamengSqlTypeFullName(object[] row)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var a = row;
 | 
				
			||||||
 | 
					            var sqlType = string.Concat(a[1]).ToUpper();
 | 
				
			||||||
 | 
					            var data_length = long.Parse(string.Concat(a[2]));
 | 
				
			||||||
 | 
					            long.TryParse(string.Concat(a[3]), out var data_precision);
 | 
				
			||||||
 | 
					            long.TryParse(string.Concat(a[4]), out var data_scale);
 | 
				
			||||||
 | 
					            //var char_used = string.Concat(a[5]);
 | 
				
			||||||
 | 
					            if (sqlType.StartsWith("INTERVAL DAY TO SECOND"))
 | 
				
			||||||
 | 
					                sqlType = $"INTERVAL DAY({(data_scale - 1536) / 16}) TO SECOND({(data_scale - 1536) % 16})";
 | 
				
			||||||
 | 
					            else if (Regex.IsMatch(sqlType, @"INTERVAL YEAR\(\d+\) TO MONTH", RegexOptions.IgnoreCase))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (sqlType.StartsWith("TIMESTAMP", StringComparison.CurrentCultureIgnoreCase))
 | 
				
			||||||
 | 
					                sqlType += data_scale <= 0 ? "" : $"({data_scale})";
 | 
				
			||||||
 | 
					            else if (sqlType.StartsWith("BLOB"))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (sqlType == "REAL" || sqlType == "DOUBLE" || sqlType == "FLOAT")
 | 
				
			||||||
 | 
					            { 
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (data_precision > 0 && data_scale > 0)
 | 
				
			||||||
 | 
					                sqlType += $"({data_precision},{data_scale})";
 | 
				
			||||||
 | 
					            else if (data_precision > 0)
 | 
				
			||||||
 | 
					                sqlType += $"({data_precision})";
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                sqlType += $"({data_length})";
 | 
				
			||||||
 | 
					            return sqlType;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										559
									
								
								Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										559
									
								
								Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,559 @@
 | 
				
			|||||||
 | 
					using Dm;
 | 
				
			||||||
 | 
					using FreeSql.DatabaseModel;
 | 
				
			||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Concurrent;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class DamengDbFirst : IDbFirst
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        IFreeSql _orm;
 | 
				
			||||||
 | 
					        protected CommonUtils _commonUtils;
 | 
				
			||||||
 | 
					        protected CommonExpression _commonExpression;
 | 
				
			||||||
 | 
					        public DamengDbFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _orm = orm;
 | 
				
			||||||
 | 
					            _commonUtils = commonUtils;
 | 
				
			||||||
 | 
					            _commonExpression = commonExpression;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
 | 
				
			||||||
 | 
					        DmDbType GetSqlDbType(DbColumnInfo column)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var dbfull = column.DbTypeTextFull.ToLower();
 | 
				
			||||||
 | 
					            switch (dbfull)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "number(1)": return DmDbType.Bit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "number(4)": return DmDbType.SByte;
 | 
				
			||||||
 | 
					                case "number(6)": return DmDbType.Int16;
 | 
				
			||||||
 | 
					                case "number(11)": return DmDbType.Int32;
 | 
				
			||||||
 | 
					                case "number(21)": return DmDbType.Int64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "number(3)": return DmDbType.Byte;
 | 
				
			||||||
 | 
					                case "number(5)": return DmDbType.UInt16;
 | 
				
			||||||
 | 
					                case "number(10)": return DmDbType.UInt32;
 | 
				
			||||||
 | 
					                case "number(20)": return DmDbType.UInt64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "float(126)": return DmDbType.Double;
 | 
				
			||||||
 | 
					                case "float(63)": return DmDbType.Float;
 | 
				
			||||||
 | 
					                case "number(10,2)": return DmDbType.Decimal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "interval day(2) to second(6)": return DmDbType.Time;
 | 
				
			||||||
 | 
					                case "timestamp(6)": return DmDbType.DateTime;
 | 
				
			||||||
 | 
					                case "timestamp(6) with local time zone": return DmDbType.DateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "blob": return DmDbType.VarBinary;
 | 
				
			||||||
 | 
					                case "nvarchar2(255)": return DmDbType.VarChar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                case "char(36)": return DmDbType.Char;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            switch (column.DbTypeText.ToLower())
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "bit":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Bit;
 | 
				
			||||||
 | 
					                case "smallint":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(4)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.UInt16;
 | 
				
			||||||
 | 
					                case "byte":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(3)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Byte;
 | 
				
			||||||
 | 
					                case "tinyint":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(3)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Byte;
 | 
				
			||||||
 | 
					                case "integer":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(11)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Int32;
 | 
				
			||||||
 | 
					                case "bigint":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(21)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Int64;
 | 
				
			||||||
 | 
					                case "dec":
 | 
				
			||||||
 | 
					                case "decimal":
 | 
				
			||||||
 | 
					                case "numeric":
 | 
				
			||||||
 | 
					                case "number":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Decimal;
 | 
				
			||||||
 | 
					                case "time":
 | 
				
			||||||
 | 
					                case "interval day to second":
 | 
				
			||||||
 | 
					                case "interval year to month":
 | 
				
			||||||
 | 
					                case "interval year":
 | 
				
			||||||
 | 
					                case "interval month":
 | 
				
			||||||
 | 
					                case "interval day":
 | 
				
			||||||
 | 
					                case "interval day to hour":
 | 
				
			||||||
 | 
					                case "interval day to minute":
 | 
				
			||||||
 | 
					                case "interval hour":
 | 
				
			||||||
 | 
					                case "interval hour to minute":
 | 
				
			||||||
 | 
					                case "interval hour to second":
 | 
				
			||||||
 | 
					                case "interval minute":
 | 
				
			||||||
 | 
					                case "interval minute to second":
 | 
				
			||||||
 | 
					                case "interval second":
 | 
				
			||||||
 | 
					                case "time with time zone":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["interval day(2) to second(6)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Time;
 | 
				
			||||||
 | 
					                case "date":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["date(7)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.DateTime;
 | 
				
			||||||
 | 
					                case "timestamp":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["timestamp(6)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.DateTime;
 | 
				
			||||||
 | 
					                case "timestamp with local time zone":
 | 
				
			||||||
 | 
					                case "timestamp with time zone":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["timestamp(6) with local time zone"]);
 | 
				
			||||||
 | 
					                    return DmDbType.DateTime;
 | 
				
			||||||
 | 
					                case "binary":
 | 
				
			||||||
 | 
					                case "varbinary":
 | 
				
			||||||
 | 
					                case "blob":
 | 
				
			||||||
 | 
					                case "image":
 | 
				
			||||||
 | 
					                case "longvarbinary":
 | 
				
			||||||
 | 
					                case "bfile":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["blob"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarBinary;
 | 
				
			||||||
 | 
					                case "nvarchar2":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarChar;
 | 
				
			||||||
 | 
					                case "varchar":
 | 
				
			||||||
 | 
					                case "varchar2":
 | 
				
			||||||
 | 
					                case "text":
 | 
				
			||||||
 | 
					                case "longvarchar":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarChar;
 | 
				
			||||||
 | 
					                case "character":
 | 
				
			||||||
 | 
					                case "char":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Char;
 | 
				
			||||||
 | 
					                case "nchar":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Char;
 | 
				
			||||||
 | 
					                case "clob":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarChar;
 | 
				
			||||||
 | 
					                case "nclob":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarChar;
 | 
				
			||||||
 | 
					                case "raw":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["blob"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarBinary;
 | 
				
			||||||
 | 
					                case "long raw":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["blob"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarBinary;
 | 
				
			||||||
 | 
					                case "real":
 | 
				
			||||||
 | 
					                case "binary_float":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["float(63)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Float;
 | 
				
			||||||
 | 
					                case "double":
 | 
				
			||||||
 | 
					                case "float":
 | 
				
			||||||
 | 
					                case "double precision":
 | 
				
			||||||
 | 
					                case "binary_double":
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["float(126)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.Double;
 | 
				
			||||||
 | 
					                case "rowid":
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
 | 
				
			||||||
 | 
					                    return DmDbType.VarChar;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static ConcurrentDictionary<string, DbToCs> _dicDbToCs = new ConcurrentDictionary<string, DbToCs>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
 | 
					        static DamengDbFirst()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var defaultDbToCs = new Dictionary<string, DbToCs>() {
 | 
				
			||||||
 | 
					                { "number(1)", new DbToCs("(bool?)", "{0} == \"1\"", "{0} == true ? \"1\" : \"0\"", "bool?", typeof(bool), typeof(bool?), "{0}.Value", "GetBoolean") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "number(4)", new DbToCs("(sbyte?)", "sbyte.Parse({0})", "{0}.ToString()", "sbyte?", typeof(sbyte), typeof(sbyte?), "{0}.Value", "GetInt16") },
 | 
				
			||||||
 | 
					                { "number(6)", new DbToCs("(short?)", "short.Parse({0})", "{0}.ToString()", "short?", typeof(short), typeof(short?), "{0}.Value", "GetInt16") },
 | 
				
			||||||
 | 
					                { "number(11)", new DbToCs("(int?)", "int.Parse({0})", "{0}.ToString()", "int?", typeof(int), typeof(int?), "{0}.Value", "GetInt32") },
 | 
				
			||||||
 | 
					                { "number(21)", new DbToCs("(long?)", "long.Parse({0})", "{0}.ToString()", "long?", typeof(long), typeof(long?), "{0}.Value", "GetInt64") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "number(3)", new DbToCs("(byte?)", "byte.Parse({0})", "{0}.ToString()", "byte?", typeof(byte), typeof(byte?), "{0}.Value", "GetByte") },
 | 
				
			||||||
 | 
					                { "number(5)", new DbToCs("(ushort?)", "ushort.Parse({0})", "{0}.ToString()", "ushort?", typeof(ushort), typeof(ushort?), "{0}.Value", "GetInt32") },
 | 
				
			||||||
 | 
					                { "number(10)", new DbToCs("(uint?)", "uint.Parse({0})", "{0}.ToString()", "uint?", typeof(uint), typeof(uint?), "{0}.Value", "GetInt64") },
 | 
				
			||||||
 | 
					                { "number(20)", new DbToCs("(ulong?)", "ulong.Parse({0})", "{0}.ToString()", "ulong?", typeof(ulong), typeof(ulong?), "{0}.Value", "GetDecimal") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "float(126)", new DbToCs("(double?)", "double.Parse({0})", "{0}.ToString()", "double?", typeof(double), typeof(double?), "{0}.Value", "GetDouble") },
 | 
				
			||||||
 | 
					                { "float(63)", new DbToCs("(float?)", "float.Parse({0})", "{0}.ToString()", "float?", typeof(float), typeof(float?), "{0}.Value", "GetFloat") },
 | 
				
			||||||
 | 
					                { "number(10,2)", new DbToCs("(decimal?)", "decimal.Parse({0})", "{0}.ToString()", "decimal?", typeof(decimal), typeof(decimal?), "{0}.Value", "GetDecimal") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "interval day(2) to second(6)", new DbToCs("(TimeSpan?)", "TimeSpan.Parse(double.Parse({0}))", "{0}.Ticks.ToString()", "TimeSpan?", typeof(TimeSpan), typeof(TimeSpan?), "{0}.Value", "GetValue") },
 | 
				
			||||||
 | 
					                { "date(7)", new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetValue") },
 | 
				
			||||||
 | 
					                { "timestamp(6)", new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetValue") },
 | 
				
			||||||
 | 
					                { "timestamp(6) with local time zone", new DbToCs("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?", typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetValue") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "blob", new DbToCs("(byte[])", "Convert.FromBase64String({0})", "Convert.ToBase64String({0})", "byte[]", typeof(byte[]), typeof(byte[]), "{0}", "GetValue") },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                { "nvarchar2(255)", new DbToCs("", "{0}.Replace(StringifySplit, \"|\")", "{0}.Replace(\"|\", StringifySplit)", "string", typeof(string), typeof(string), "{0}", "GetString") },
 | 
				
			||||||
 | 
					                { "char(36 char)", new DbToCs("(Guid?)", "Guid.Parse({0})", "{0}.ToString()", "Guid?", typeof(Guid), typeof(Guid?), "{0}.Value", "GetGuid") },
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            foreach (var kv in defaultDbToCs)
 | 
				
			||||||
 | 
					                _dicDbToCs.TryAdd(kv.Key, kv.Value);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string GetCsConvert(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? (column.IsNullable ? trydc.csConvert : trydc.csConvert.Replace("?", "")) : null;
 | 
				
			||||||
 | 
					        public string GetCsParse(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csParse : null;
 | 
				
			||||||
 | 
					        public string GetCsStringify(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csStringify : null;
 | 
				
			||||||
 | 
					        public string GetCsType(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? (column.IsNullable ? trydc.csType : trydc.csType.Replace("?", "")) : null;
 | 
				
			||||||
 | 
					        public Type GetCsTypeInfo(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csTypeInfo : null;
 | 
				
			||||||
 | 
					        public string GetCsTypeValue(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.csTypeValue : null;
 | 
				
			||||||
 | 
					        public string GetDataReaderMethod(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbTypeTextFull, out var trydc) ? trydc.dataReaderMethod : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public List<string> GetDatabases()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var sql = @" select username from all_users";
 | 
				
			||||||
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					            return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var loc1 = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
 | 
					            var database = database2?.ToArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (database == null || database.Any() == false)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
				
			||||||
 | 
					                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
				
			||||||
 | 
					                database = new[] { userUsers };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
 | 
					            var sql = string.Format(@"
 | 
				
			||||||
 | 
					select
 | 
				
			||||||
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
 | 
					a.owner,
 | 
				
			||||||
 | 
					a.table_name,
 | 
				
			||||||
 | 
					b.comments,
 | 
				
			||||||
 | 
					'TABLE'
 | 
				
			||||||
 | 
					from all_tables a
 | 
				
			||||||
 | 
					left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE'
 | 
				
			||||||
 | 
					where a.owner in ({0})", databaseIn);
 | 
				
			||||||
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var loc6 = new List<string[]>();
 | 
				
			||||||
 | 
					            var loc66 = new List<string[]>();
 | 
				
			||||||
 | 
					            var loc6_1000 = new List<string>();
 | 
				
			||||||
 | 
					            var loc66_1000 = new List<string>();
 | 
				
			||||||
 | 
					            foreach (var row in ds)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var table_id = string.Concat(row[0]);
 | 
				
			||||||
 | 
					                var schema = string.Concat(row[1]);
 | 
				
			||||||
 | 
					                var table = string.Concat(row[2]);
 | 
				
			||||||
 | 
					                var comment = string.Concat(row[3]);
 | 
				
			||||||
 | 
					                var type = string.Concat(row[4]) == "VIEW" ? DbTableType.VIEW : DbTableType.TABLE;
 | 
				
			||||||
 | 
					                if (database.Length == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
				
			||||||
 | 
					                    schema = "";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                loc2.Add(table_id, new DbTableInfo { Id = table_id, Schema = schema, Name = table, Comment = comment, Type = type });
 | 
				
			||||||
 | 
					                loc3.Add(table_id, new Dictionary<string, DbColumnInfo>());
 | 
				
			||||||
 | 
					                switch (type)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case DbTableType.TABLE:
 | 
				
			||||||
 | 
					                    case DbTableType.VIEW:
 | 
				
			||||||
 | 
					                        loc6_1000.Add(table.Replace("'", "''"));
 | 
				
			||||||
 | 
					                        if (loc6_1000.Count >= 999)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            loc6.Add(loc6_1000.ToArray());
 | 
				
			||||||
 | 
					                            loc6_1000.Clear();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case DbTableType.StoreProcedure:
 | 
				
			||||||
 | 
					                        loc66_1000.Add(table.Replace("'", "''"));
 | 
				
			||||||
 | 
					                        if (loc66_1000.Count >= 999)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            loc66.Add(loc66_1000.ToArray());
 | 
				
			||||||
 | 
					                            loc66_1000.Clear();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (loc6_1000.Count > 0) loc6.Add(loc6_1000.ToArray());
 | 
				
			||||||
 | 
					            if (loc66_1000.Count > 0) loc66.Add(loc66_1000.ToArray());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (loc6.Count == 0) return loc1;
 | 
				
			||||||
 | 
					            var loc8 = new StringBuilder().Append("(");
 | 
				
			||||||
 | 
					            for (var loc8idx = 0; loc8idx < loc6.Count; loc8idx++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (loc8idx > 0) loc8.Append(" OR ");
 | 
				
			||||||
 | 
					                loc8.Append("a.table_name in (");
 | 
				
			||||||
 | 
					                for (var loc8idx2 = 0; loc8idx2 < loc6[loc8idx].Length; loc8idx2++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (loc8idx2 > 0) loc8.Append(",");
 | 
				
			||||||
 | 
					                    loc8.Append($"'{loc6[loc8idx][loc8idx2]}'");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                loc8.Append(")");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            loc8.Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = string.Format(@"
 | 
				
			||||||
 | 
					select
 | 
				
			||||||
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
 | 
					a.column_name,
 | 
				
			||||||
 | 
					a.data_type,
 | 
				
			||||||
 | 
					a.data_length,
 | 
				
			||||||
 | 
					a.data_precision,
 | 
				
			||||||
 | 
					a.data_scale,
 | 
				
			||||||
 | 
					a.char_used,
 | 
				
			||||||
 | 
					case when a.nullable = 'N' then 0 else 1 end,
 | 
				
			||||||
 | 
					nvl((select 1 from user_sequences where upper(sequence_name)=upper(a.table_name||'_seq_'||a.column_name) and rownum < 2), 0),
 | 
				
			||||||
 | 
					b.comments,
 | 
				
			||||||
 | 
					a.data_default
 | 
				
			||||||
 | 
					from all_tab_cols a
 | 
				
			||||||
 | 
					left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
				
			||||||
 | 
					where a.owner in ({1}) and {0}
 | 
				
			||||||
 | 
					", loc8, databaseIn);
 | 
				
			||||||
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var ds2 = new List<object[]>();
 | 
				
			||||||
 | 
					            foreach (var row in ds)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var ds2item = new object[9];
 | 
				
			||||||
 | 
					                ds2item[0] = row[0];
 | 
				
			||||||
 | 
					                ds2item[1] = row[1];
 | 
				
			||||||
 | 
					                ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", "");
 | 
				
			||||||
 | 
					                ds2item[4] = DamengCodeFirst.GetDamengSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] });
 | 
				
			||||||
 | 
					                ds2item[5] = string.Concat(row[7]) == "1";
 | 
				
			||||||
 | 
					                ds2item[6] = string.Concat(row[8]) == "1";
 | 
				
			||||||
 | 
					                ds2item[7] = string.Concat(row[9]);
 | 
				
			||||||
 | 
					                ds2item[8] = string.Concat(row[10]);
 | 
				
			||||||
 | 
					                ds2.Add(ds2item);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (var row in ds2)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                string table_id = string.Concat(row[0]);
 | 
				
			||||||
 | 
					                string column = string.Concat(row[1]);
 | 
				
			||||||
 | 
					                string type = string.Concat(row[2]);
 | 
				
			||||||
 | 
					                //long max_length = long.Parse(string.Concat(row[3]));
 | 
				
			||||||
 | 
					                string sqlType = string.Concat(row[4]);
 | 
				
			||||||
 | 
					                var m_len = Regex.Match(sqlType, @"\w+\((\d+)");
 | 
				
			||||||
 | 
					                int max_length = m_len.Success ? int.Parse(m_len.Groups[1].Value) : -1;
 | 
				
			||||||
 | 
					                bool is_nullable = string.Concat(row[5]) == "1";
 | 
				
			||||||
 | 
					                bool is_identity = string.Concat(row[6]) == "1";
 | 
				
			||||||
 | 
					                string comment = string.Concat(row[7]);
 | 
				
			||||||
 | 
					                string defaultValue = string.Concat(row[8]);
 | 
				
			||||||
 | 
					                if (max_length == 0) max_length = -1;
 | 
				
			||||||
 | 
					                if (database.Length == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                loc3[table_id].Add(column, new DbColumnInfo
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Name = column,
 | 
				
			||||||
 | 
					                    MaxLength = max_length,
 | 
				
			||||||
 | 
					                    IsIdentity = is_identity,
 | 
				
			||||||
 | 
					                    IsNullable = is_nullable,
 | 
				
			||||||
 | 
					                    IsPrimary = false,
 | 
				
			||||||
 | 
					                    DbTypeText = type,
 | 
				
			||||||
 | 
					                    DbTypeTextFull = sqlType,
 | 
				
			||||||
 | 
					                    Table = loc2[table_id],
 | 
				
			||||||
 | 
					                    Coment = comment,
 | 
				
			||||||
 | 
					                    DefaultValue = defaultValue
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                loc3[table_id][column].DbType = this.GetDbType(loc3[table_id][column]);
 | 
				
			||||||
 | 
					                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = string.Format(@"
 | 
				
			||||||
 | 
					select
 | 
				
			||||||
 | 
					a.table_owner || '.' || a.table_name,
 | 
				
			||||||
 | 
					c.column_name,
 | 
				
			||||||
 | 
					c.index_name,
 | 
				
			||||||
 | 
					case when a.uniqueness = 'UNIQUE' then 1 else 0 end,
 | 
				
			||||||
 | 
					case when exists(select 1 from all_constraints where constraint_name = a.index_name and constraint_type = 'P') then 1 else 0 end,
 | 
				
			||||||
 | 
					0,
 | 
				
			||||||
 | 
					case when c.descend = 'DESC' then 1 else 0 end,
 | 
				
			||||||
 | 
					c.column_position
 | 
				
			||||||
 | 
					from all_indexes a,
 | 
				
			||||||
 | 
					all_ind_columns c 
 | 
				
			||||||
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
 | 
					and a.table_owner in ({1}) and {0}
 | 
				
			||||||
 | 
					", loc8, databaseIn);
 | 
				
			||||||
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var indexColumns = new Dictionary<string, Dictionary<string, DbIndexInfo>>();
 | 
				
			||||||
 | 
					            var uniqueColumns = new Dictionary<string, Dictionary<string, DbIndexInfo>>();
 | 
				
			||||||
 | 
					            foreach (var row in ds)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                string table_id = string.Concat(row[0]);
 | 
				
			||||||
 | 
					                string column = string.Concat(row[1]).Trim('"');
 | 
				
			||||||
 | 
					                string index_id = string.Concat(row[2]);
 | 
				
			||||||
 | 
					                bool is_unique = string.Concat(row[3]) == "1";
 | 
				
			||||||
 | 
					                bool is_primary_key = string.Concat(row[4]) == "1";
 | 
				
			||||||
 | 
					                bool is_clustered = string.Concat(row[5]) == "1";
 | 
				
			||||||
 | 
					                bool is_desc = string.Concat(row[6]) == "1";
 | 
				
			||||||
 | 
					                if (database.Length == 1)
 | 
				
			||||||
 | 
					                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
				
			||||||
 | 
					                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
				
			||||||
 | 
					                var loc9 = loc3[table_id][column];
 | 
				
			||||||
 | 
					                if (loc9.IsPrimary == false && is_primary_key) loc9.IsPrimary = is_primary_key;
 | 
				
			||||||
 | 
					                if (is_primary_key) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Dictionary<string, DbIndexInfo> loc10 = null;
 | 
				
			||||||
 | 
					                DbIndexInfo loc11 = null;
 | 
				
			||||||
 | 
					                if (!indexColumns.TryGetValue(table_id, out loc10))
 | 
				
			||||||
 | 
					                    indexColumns.Add(table_id, loc10 = new Dictionary<string, DbIndexInfo>());
 | 
				
			||||||
 | 
					                if (!loc10.TryGetValue(index_id, out loc11))
 | 
				
			||||||
 | 
					                    loc10.Add(index_id, loc11 = new DbIndexInfo());
 | 
				
			||||||
 | 
					                loc11.Columns.Add(new DbIndexColumnInfo { Column = loc9, IsDesc = is_desc });
 | 
				
			||||||
 | 
					                if (is_unique && !is_primary_key)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (!uniqueColumns.TryGetValue(table_id, out loc10))
 | 
				
			||||||
 | 
					                        uniqueColumns.Add(table_id, loc10 = new Dictionary<string, DbIndexInfo>());
 | 
				
			||||||
 | 
					                    if (!loc10.TryGetValue(index_id, out loc11))
 | 
				
			||||||
 | 
					                        loc10.Add(index_id, loc11 = new DbIndexInfo());
 | 
				
			||||||
 | 
					                    loc11.Columns.Add(new DbIndexColumnInfo { Column = loc9, IsDesc = is_desc });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (string table_id in indexColumns.Keys)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                foreach (var column in indexColumns[table_id])
 | 
				
			||||||
 | 
					                    loc2[table_id].IndexesDict.Add(column.Key, column.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (string table_id in uniqueColumns.Keys)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                foreach (var column in uniqueColumns[table_id])
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    column.Value.Columns.Sort((c1, c2) => c1.Column.Name.CompareTo(c2.Column.Name));
 | 
				
			||||||
 | 
					                    loc2[table_id].UniquesDict.Add(column.Key, column.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql = string.Format(@"
 | 
				
			||||||
 | 
					select
 | 
				
			||||||
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
 | 
					c.column_name,
 | 
				
			||||||
 | 
					c.constraint_name,
 | 
				
			||||||
 | 
					b.owner || '.' || b.table_name,
 | 
				
			||||||
 | 
					1,
 | 
				
			||||||
 | 
					d.column_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- a.owner 外键拥有者,
 | 
				
			||||||
 | 
					-- a.table_name 外键表,
 | 
				
			||||||
 | 
					-- c.column_name 外键列,
 | 
				
			||||||
 | 
					-- b.owner 主键拥有者,
 | 
				
			||||||
 | 
					-- b.table_name 主键表,
 | 
				
			||||||
 | 
					-- d.column_name 主键列,
 | 
				
			||||||
 | 
					-- c.constraint_name 外键名,
 | 
				
			||||||
 | 
					-- d.constraint_name 主键名
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from
 | 
				
			||||||
 | 
					all_constraints a,
 | 
				
			||||||
 | 
					all_constraints b,
 | 
				
			||||||
 | 
					all_cons_columns c, --外键表
 | 
				
			||||||
 | 
					all_cons_columns d  --主键表
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					a.r_constraint_name = b.constraint_name   
 | 
				
			||||||
 | 
					and a.constraint_type = 'R'   
 | 
				
			||||||
 | 
					and b.constraint_type = 'P'   
 | 
				
			||||||
 | 
					and a.r_owner = b.owner   
 | 
				
			||||||
 | 
					and a.constraint_name = c.constraint_name   
 | 
				
			||||||
 | 
					and b.constraint_name = d.constraint_name   
 | 
				
			||||||
 | 
					and a.owner = c.owner   
 | 
				
			||||||
 | 
					and a.table_name = c.table_name   
 | 
				
			||||||
 | 
					and b.owner = d.owner   
 | 
				
			||||||
 | 
					and b.table_name = d.table_name
 | 
				
			||||||
 | 
					and a.owner in ({1}) and {0}
 | 
				
			||||||
 | 
					", loc8, databaseIn);
 | 
				
			||||||
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
				
			||||||
 | 
					            foreach (var row in ds)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                string table_id = string.Concat(row[0]);
 | 
				
			||||||
 | 
					                string column = string.Concat(row[1]);
 | 
				
			||||||
 | 
					                string fk_id = string.Concat(row[2]);
 | 
				
			||||||
 | 
					                string ref_table_id = string.Concat(row[3]);
 | 
				
			||||||
 | 
					                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
				
			||||||
 | 
					                string referenced_column = string.Concat(row[5]);
 | 
				
			||||||
 | 
					                if (database.Length == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
				
			||||||
 | 
					                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
				
			||||||
 | 
					                var loc9 = loc3[table_id][column];
 | 
				
			||||||
 | 
					                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
				
			||||||
 | 
					                var loc10 = loc2[ref_table_id];
 | 
				
			||||||
 | 
					                var loc11 = loc3[ref_table_id][referenced_column];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
				
			||||||
 | 
					                DbForeignInfo loc13 = null;
 | 
				
			||||||
 | 
					                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
				
			||||||
 | 
					                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
				
			||||||
 | 
					                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
				
			||||||
 | 
					                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
				
			||||||
 | 
					                loc13.Columns.Add(loc9);
 | 
				
			||||||
 | 
					                loc13.ReferencedColumns.Add(loc11);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
 | 
					                foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
 | 
					                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach (var table_id in loc3.Keys)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                foreach (var loc5 in loc3[table_id].Values)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    loc2[table_id].Columns.Add(loc5);
 | 
				
			||||||
 | 
					                    if (loc5.IsIdentity) loc2[table_id].Identitys.Add(loc5);
 | 
				
			||||||
 | 
					                    if (loc5.IsPrimary) loc2[table_id].Primarys.Add(loc5);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            foreach (var loc4 in loc2.Values)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                //if (loc4.Primarys.Count == 0 && loc4.UniquesDict.Count > 0)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    foreach (var loc5 in loc4.UniquesDict.First().Value.Columns)
 | 
				
			||||||
 | 
					                //    {
 | 
				
			||||||
 | 
					                //        loc5.Column.IsPrimary = true;
 | 
				
			||||||
 | 
					                //        loc4.Primarys.Add(loc5.Column);
 | 
				
			||||||
 | 
					                //    }
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                loc4.Primarys.Sort((c1, c2) => c1.Name.CompareTo(c2.Name));
 | 
				
			||||||
 | 
					                loc4.Columns.Sort((c1, c2) =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    int compare = c2.IsPrimary.CompareTo(c1.IsPrimary);
 | 
				
			||||||
 | 
					                    if (compare == 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        bool b1 = loc4.ForeignsDict.Values.Where(fk => fk.Columns.Where(c3 => c3.Name == c1.Name).Any()).Any();
 | 
				
			||||||
 | 
					                        bool b2 = loc4.ForeignsDict.Values.Where(fk => fk.Columns.Where(c3 => c3.Name == c2.Name).Any()).Any();
 | 
				
			||||||
 | 
					                        compare = b2.CompareTo(b1);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (compare == 0) compare = c1.Name.CompareTo(c2.Name);
 | 
				
			||||||
 | 
					                    return compare;
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                loc1.Add(loc4);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            loc1.Sort((t1, t2) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var ret = t1.Schema.CompareTo(t2.Schema);
 | 
				
			||||||
 | 
					                if (ret == 0) ret = t1.Name.CompareTo(t2.Name);
 | 
				
			||||||
 | 
					                return ret;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            loc2.Clear();
 | 
				
			||||||
 | 
					            loc3.Clear();
 | 
				
			||||||
 | 
					            return loc1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return new List<DbEnumInfo>();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										469
									
								
								Providers/FreeSql.Provider.Dameng/DamengExpression.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										469
									
								
								Providers/FreeSql.Provider.Dameng/DamengExpression.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,469 @@
 | 
				
			|||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Linq.Expressions;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class DamengExpression : CommonExpression
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DamengExpression(CommonUtils common) : base(common) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            switch (exp.NodeType)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case ExpressionType.Convert:
 | 
				
			||||||
 | 
					                    var operandExp = (exp as UnaryExpression)?.Operand;
 | 
				
			||||||
 | 
					                    var gentype = exp.Type.NullableTypeOrThis();
 | 
				
			||||||
 | 
					                    if (gentype != operandExp.Type.NullableTypeOrThis())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        switch (exp.Type.NullableTypeOrThis().ToString())
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            //case "System.Boolean": return $"({getExp(operandExp)} not in ('0','false'))";
 | 
				
			||||||
 | 
					                            case "System.Byte": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.Char": return $"substr(to_char({getExp(operandExp)}), 1, 1)";
 | 
				
			||||||
 | 
					                            case "System.DateTime": return $"to_timestamp({getExp(operandExp)},'YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                            case "System.Decimal": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.Double": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.Int16":
 | 
				
			||||||
 | 
					                            case "System.Int32":
 | 
				
			||||||
 | 
					                            case "System.Int64":
 | 
				
			||||||
 | 
					                            case "System.SByte": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.Single": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.String": return $"to_char({getExp(operandExp)})";
 | 
				
			||||||
 | 
					                            case "System.UInt16":
 | 
				
			||||||
 | 
					                            case "System.UInt32":
 | 
				
			||||||
 | 
					                            case "System.UInt64": return $"cast({getExp(operandExp)} as number)";
 | 
				
			||||||
 | 
					                            case "System.Guid":
 | 
				
			||||||
 | 
					                                if (tsc.mapType == typeof(byte[])) return $"hextoraw({getExp(operandExp)})";
 | 
				
			||||||
 | 
					                                return $"to_char({getExp(operandExp)})";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case ExpressionType.Call:
 | 
				
			||||||
 | 
					                    var callExp = exp as MethodCallExpression;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    switch (callExp.Method.Name)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        case "Parse":
 | 
				
			||||||
 | 
					                        case "TryParse":
 | 
				
			||||||
 | 
					                            switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString())
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                //case "System.Boolean": return $"({getExp(callExp.Arguments[0])} not in ('0','false'))";
 | 
				
			||||||
 | 
					                                case "System.Byte": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.Char": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 1)";
 | 
				
			||||||
 | 
					                                case "System.DateTime": return $"to_timestamp({getExp(callExp.Arguments[0])},'YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                                case "System.Decimal": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.Double": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.Int16":
 | 
				
			||||||
 | 
					                                case "System.Int32":
 | 
				
			||||||
 | 
					                                case "System.Int64":
 | 
				
			||||||
 | 
					                                case "System.SByte": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.Single": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.UInt16":
 | 
				
			||||||
 | 
					                                case "System.UInt32":
 | 
				
			||||||
 | 
					                                case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                                case "System.Guid":
 | 
				
			||||||
 | 
					                                    if (tsc.mapType == typeof(byte[])) return $"hextoraw({getExp(callExp.Arguments[0])})";
 | 
				
			||||||
 | 
					                                    return $"to_char({getExp(callExp.Arguments[0])})";
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                        case "NewGuid":
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                        case "Next":
 | 
				
			||||||
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)";
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                        case "NextDouble":
 | 
				
			||||||
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value";
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                        case "Random":
 | 
				
			||||||
 | 
					                            if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value";
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                        case "ToString":
 | 
				
			||||||
 | 
					                            if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null;
 | 
				
			||||||
 | 
					                            return null;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var objExp = callExp.Object;
 | 
				
			||||||
 | 
					                    var objType = objExp?.Type;
 | 
				
			||||||
 | 
					                    if (objType?.FullName == "System.Byte[]") return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var argIndex = 0;
 | 
				
			||||||
 | 
					                    if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        objExp = callExp.Arguments.FirstOrDefault();
 | 
				
			||||||
 | 
					                        objType = objExp?.Type;
 | 
				
			||||||
 | 
					                        argIndex++;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (objType == null) objType = callExp.Method.DeclaringType;
 | 
				
			||||||
 | 
					                    if (objType != null || objType.IsArrayOrList())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (argIndex >= callExp.Arguments.Count) break;
 | 
				
			||||||
 | 
					                        tsc.SetMapColumnTmp(null);
 | 
				
			||||||
 | 
					                        var args1 = getExp(callExp.Arguments[argIndex]);
 | 
				
			||||||
 | 
					                        var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp);
 | 
				
			||||||
 | 
					                        var oldDbParams = tsc.SetDbParamsReturnOld(null);
 | 
				
			||||||
 | 
					                        var left = objExp == null ? null : getExp(objExp);
 | 
				
			||||||
 | 
					                        tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType);
 | 
				
			||||||
 | 
					                        tsc.SetDbParamsReturnOld(oldDbParams);
 | 
				
			||||||
 | 
					                        switch (callExp.Method.Name)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            case "Contains":
 | 
				
			||||||
 | 
					                                //判断 in //在各大 Provider AdoProvider 中已约定,500元素分割, 3空格\r\n4空格
 | 
				
			||||||
 | 
					                                return $"(({args1}) in {left.Replace(",   \r\n    \r\n", $") \r\n OR ({args1}) in (")})";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case ExpressionType.NewArrayInit:
 | 
				
			||||||
 | 
					                    var arrExp = exp as NewArrayExpression;
 | 
				
			||||||
 | 
					                    var arrSb = new StringBuilder();
 | 
				
			||||||
 | 
					                    arrSb.Append("(");
 | 
				
			||||||
 | 
					                    for (var a = 0; a < arrExp.Expressions.Count; a++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (a > 0) arrSb.Append(",");
 | 
				
			||||||
 | 
					                        arrSb.Append(getExp(arrExp.Expressions[a]));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (arrSb.Length == 1) arrSb.Append("NULL");
 | 
				
			||||||
 | 
					                    return arrSb.Append(")").ToString();
 | 
				
			||||||
 | 
					                case ExpressionType.ListInit:
 | 
				
			||||||
 | 
					                    var listExp = exp as ListInitExpression;
 | 
				
			||||||
 | 
					                    var listSb = new StringBuilder();
 | 
				
			||||||
 | 
					                    listSb.Append("(");
 | 
				
			||||||
 | 
					                    for (var a = 0; a < listExp.Initializers.Count; a++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (listExp.Initializers[a].Arguments.Any() == false) continue;
 | 
				
			||||||
 | 
					                        if (a > 0) listSb.Append(",");
 | 
				
			||||||
 | 
					                        listSb.Append(getExp(listExp.Initializers[a].Arguments.FirstOrDefault()));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (listSb.Length == 1) listSb.Append("NULL");
 | 
				
			||||||
 | 
					                    return listSb.Append(")").ToString();
 | 
				
			||||||
 | 
					                case ExpressionType.New:
 | 
				
			||||||
 | 
					                    var newExp = exp as NewExpression;
 | 
				
			||||||
 | 
					                    if (typeof(IList).IsAssignableFrom(newExp.Type))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (newExp.Arguments.Count == 0) return "(NULL)";
 | 
				
			||||||
 | 
					                        if (typeof(IEnumerable).IsAssignableFrom(newExp.Arguments[0].Type) == false) return "(NULL)";
 | 
				
			||||||
 | 
					                        return getExp(newExp.Arguments[0]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (exp.Expression == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Member.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Empty": return "''";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var left = ExpressionLambdaToSql(exp.Expression, tsc);
 | 
				
			||||||
 | 
					            switch (exp.Member.Name)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "Length": return $"length({left})";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (exp.Expression == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Member.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Now": return _common.Now;
 | 
				
			||||||
 | 
					                    case "UtcNow": return _common.NowUtc;
 | 
				
			||||||
 | 
					                    case "Today": return "trunc(systimestamp)";
 | 
				
			||||||
 | 
					                    case "MinValue": return "to_timestamp('0001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                    case "MaxValue": return "to_timestamp('9999-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var left = ExpressionLambdaToSql(exp.Expression, tsc);
 | 
				
			||||||
 | 
					            switch (exp.Member.Name)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "Date": return $"trunc({left})";
 | 
				
			||||||
 | 
					                case "TimeOfDay": return $"(cast({left} as timestamp with time zone)-trunc({left}))";
 | 
				
			||||||
 | 
					                case "DayOfWeek": return $"case when to_char({left})='7' then 0 else cast(to_char({left}) as number) end";
 | 
				
			||||||
 | 
					                case "Day": return $"cast(to_char({left},'DD') as number)";
 | 
				
			||||||
 | 
					                case "DayOfYear": return $"cast(to_char({left},'DDD') as number)";
 | 
				
			||||||
 | 
					                case "Month": return $"cast(to_char({left},'MM') as number)";
 | 
				
			||||||
 | 
					                case "Year": return $"cast(to_char({left},'YYYY') as number)";
 | 
				
			||||||
 | 
					                case "Hour": return $"cast(to_char({left},'HH24') as number)";
 | 
				
			||||||
 | 
					                case "Minute": return $"cast(to_char({left},'MI') as number)";
 | 
				
			||||||
 | 
					                case "Second": return $"cast(to_char({left},'SS') as number)";
 | 
				
			||||||
 | 
					                case "Millisecond": return $"cast(to_char({left},'FF3') as number)";
 | 
				
			||||||
 | 
					                case "Ticks": return $"cast(to_char({left},'FF7') as number)";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (exp.Expression == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Member.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Zero": return "numtodsinterval(0,'second')";
 | 
				
			||||||
 | 
					                    case "MinValue": return "numtodsinterval(-233720368.5477580,'second')";
 | 
				
			||||||
 | 
					                    case "MaxValue": return "numtodsinterval(233720368.5477580,'second')";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var left = ExpressionLambdaToSql(exp.Expression, tsc);
 | 
				
			||||||
 | 
					            switch (exp.Member.Name)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "Days": return $"extract(day from {left})";
 | 
				
			||||||
 | 
					                case "Hours": return $"extract(hour from {left})";
 | 
				
			||||||
 | 
					                case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),2,3) as number)";
 | 
				
			||||||
 | 
					                case "Minutes": return $"extract(minute from {left})";
 | 
				
			||||||
 | 
					                case "Seconds": return $"floor(extract(second from {left}))";
 | 
				
			||||||
 | 
					                case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000";
 | 
				
			||||||
 | 
					                case "TotalDays": return $"extract(day from {left})";
 | 
				
			||||||
 | 
					                case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))";
 | 
				
			||||||
 | 
					                case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000";
 | 
				
			||||||
 | 
					                case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))";
 | 
				
			||||||
 | 
					                case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            if (exp.Object == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "IsNullOrEmpty":
 | 
				
			||||||
 | 
					                        var arg1 = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        return $"({arg1} is null or {arg1} = '')";
 | 
				
			||||||
 | 
					                    case "IsNullOrWhiteSpace":
 | 
				
			||||||
 | 
					                        var arg2 = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
 | 
					                    case "Concat":
 | 
				
			||||||
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var left = getExp(exp.Object);
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "StartsWith":
 | 
				
			||||||
 | 
					                    case "EndsWith":
 | 
				
			||||||
 | 
					                    case "Contains":
 | 
				
			||||||
 | 
					                        var args0Value = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        if (args0Value == "NULL") return $"({left}) IS NULL";
 | 
				
			||||||
 | 
					                        if (exp.Method.Name == "StartsWith") return $"({left}) LIKE {(args0Value.EndsWith("'") ? args0Value.Insert(args0Value.Length - 1, "%") : $"(to_char({args0Value})||'%')")}";
 | 
				
			||||||
 | 
					                        if (exp.Method.Name == "EndsWith") return $"({left}) LIKE {(args0Value.StartsWith("'") ? args0Value.Insert(1, "%") : $"('%'||to_char({args0Value}))")}";
 | 
				
			||||||
 | 
					                        if (args0Value.StartsWith("'") && args0Value.EndsWith("'")) return $"({left}) LIKE {args0Value.Insert(1, "%").Insert(args0Value.Length, "%")}";
 | 
				
			||||||
 | 
					                        return $"({left}) LIKE ('%'||to_char({args0Value})||'%')";
 | 
				
			||||||
 | 
					                    case "ToLower": return $"lower({left})";
 | 
				
			||||||
 | 
					                    case "ToUpper": return $"upper({left})";
 | 
				
			||||||
 | 
					                    case "Substring":
 | 
				
			||||||
 | 
					                        var substrArgs1 = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        if (long.TryParse(substrArgs1, out var testtrylng1)) substrArgs1 = (testtrylng1 + 1).ToString();
 | 
				
			||||||
 | 
					                        else substrArgs1 += "+1";
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return $"substr({left}, {substrArgs1})";
 | 
				
			||||||
 | 
					                        return $"substr({left}, {substrArgs1}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    case "IndexOf":
 | 
				
			||||||
 | 
					                        var indexOfFindStr = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count > 1 && exp.Arguments[1].Type.FullName == "System.Int32")
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var locateArgs1 = getExp(exp.Arguments[1]);
 | 
				
			||||||
 | 
					                            if (long.TryParse(locateArgs1, out var testtrylng2)) locateArgs1 = (testtrylng2 + 1).ToString();
 | 
				
			||||||
 | 
					                            else locateArgs1 += "+1";
 | 
				
			||||||
 | 
					                            return $"(instr({left}, {indexOfFindStr}, {locateArgs1}, 1)-1)";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        return $"(instr({left}, {indexOfFindStr}, 1, 1))-1";
 | 
				
			||||||
 | 
					                    case "PadLeft":
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return $"lpad({left}, {getExp(exp.Arguments[0])}, ' ')";
 | 
				
			||||||
 | 
					                        return $"lpad({left}, {getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    case "PadRight":
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return $"rpad({left}, {getExp(exp.Arguments[0])}, ' ')";
 | 
				
			||||||
 | 
					                        return $"rpad({left}, {getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    case "Trim":
 | 
				
			||||||
 | 
					                    case "TrimStart":
 | 
				
			||||||
 | 
					                    case "TrimEnd":
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 0)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (exp.Method.Name == "Trim") return $"trim({left})";
 | 
				
			||||||
 | 
					                            if (exp.Method.Name == "TrimStart") return $"ltrim({left})";
 | 
				
			||||||
 | 
					                            if (exp.Method.Name == "TrimEnd") return $"rtrim({left})";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        foreach (var argsTrim02 in exp.Arguments)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var argsTrim01s = new[] { argsTrim02 };
 | 
				
			||||||
 | 
					                            if (argsTrim02.NodeType == ExpressionType.NewArrayInit)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                var arritem = argsTrim02 as NewArrayExpression;
 | 
				
			||||||
 | 
					                                argsTrim01s = arritem.Expressions.ToArray();
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            foreach (var argsTrim01 in argsTrim01s)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (exp.Method.Name == "Trim") left = $"trim(both {getExp(argsTrim01)} from {left})";
 | 
				
			||||||
 | 
					                                if (exp.Method.Name == "TrimStart") left = $"ltrim({left},{getExp(argsTrim01)})";
 | 
				
			||||||
 | 
					                                if (exp.Method.Name == "TrimEnd") left = $"rtrim({left},{getExp(argsTrim01)})";
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        return left;
 | 
				
			||||||
 | 
					                    case "Replace": return $"replace({left}, {getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    case "CompareTo": return $"case when {left} = {getExp(exp.Arguments[0])} then 0 when {left} > {getExp(exp.Arguments[0])} then 1 else -1 end";
 | 
				
			||||||
 | 
					                    case "Equals": return $"({left} = {getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            switch (exp.Method.Name)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "Abs": return $"abs({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Sign": return $"sign({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Floor": return $"floor({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Ceiling": return $"ceil({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Round":
 | 
				
			||||||
 | 
					                    if (exp.Arguments.Count > 1 && exp.Arguments[1].Type.FullName == "System.Int32") return $"round({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    return $"round({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Exp": return $"exp({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Log":
 | 
				
			||||||
 | 
					                    if (exp.Arguments.Count > 1) return $"log({getExp(exp.Arguments[1])},{getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                    return $"log(2.7182818284590451,{getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Log10": return $"log(10,{getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Pow": return $"power({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                case "Sqrt": return $"sqrt({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Cos": return $"cos({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Sin": return $"sin({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Tan": return $"tan({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Acos": return $"acos({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Asin": return $"asin({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                case "Atan": return $"atan({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                //case "Atan2": return $"atan2({getExp(exp.Arguments[0])}, {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                case "Truncate": return $"trunc({getExp(exp.Arguments[0])}, 0)";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            if (exp.Object == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))";
 | 
				
			||||||
 | 
					                    case "DaysInMonth": return $"cast(to_char(last_day(({getExp(exp.Arguments[0])})||'-'||({getExp(exp.Arguments[1])})||'-01'),'DD') as number)";
 | 
				
			||||||
 | 
					                    case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    case "IsLeapYear":
 | 
				
			||||||
 | 
					                        var isLeapYearArgs1 = getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                        return $"(mod({isLeapYearArgs1},4)=0 AND mod({isLeapYearArgs1},100)<>0 OR mod({isLeapYearArgs1},400)=0)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    case "Parse": return $"to_timestamp({getExp(exp.Arguments[0])},'YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                    case "ParseExact":
 | 
				
			||||||
 | 
					                    case "TryParse":
 | 
				
			||||||
 | 
					                    case "TryParseExact": return $"to_timestamp({getExp(exp.Arguments[0])},'YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var left = getExp(exp.Object);
 | 
				
			||||||
 | 
					                var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Add": return $"({left}+{args1})";
 | 
				
			||||||
 | 
					                    case "AddDays": return $"({left}+{args1})";
 | 
				
			||||||
 | 
					                    case "AddHours": return $"({left}+({args1})/24)";
 | 
				
			||||||
 | 
					                    case "AddMilliseconds": return $"({left}+({args1})/86400000)";
 | 
				
			||||||
 | 
					                    case "AddMinutes": return $"({left}+({args1})/1440)";
 | 
				
			||||||
 | 
					                    case "AddMonths": return $"add_months({left},{args1})";
 | 
				
			||||||
 | 
					                    case "AddSeconds": return $"({left}+({args1})/86400)";
 | 
				
			||||||
 | 
					                    case "AddTicks": return $"({left}+({args1})/864000000000)";
 | 
				
			||||||
 | 
					                    case "AddYears": return $"add_months({left},({args1})*12)";
 | 
				
			||||||
 | 
					                    case "Subtract":
 | 
				
			||||||
 | 
					                        switch ((exp.Arguments[0].Type.IsNullableType() ? exp.Arguments[0].Type.GetGenericArguments().FirstOrDefault() : exp.Arguments[0].Type).FullName)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            case "System.DateTime": return $"(cast({left} as timestamp with time zone)-{args1})";
 | 
				
			||||||
 | 
					                            case "System.TimeSpan": return $"({left}-{args1})";
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case "Equals": return $"({left} = {args1})";
 | 
				
			||||||
 | 
					                    case "CompareTo": return $"extract(day from ({left}-({args1})))";
 | 
				
			||||||
 | 
					                    case "ToString": return exp.Arguments.Count == 0 ? $"to_char({left},'YYYY-MM-DD HH24:MI:SS.FF6')" : null;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            if (exp.Object == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))";
 | 
				
			||||||
 | 
					                    case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})";
 | 
				
			||||||
 | 
					                    case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')";
 | 
				
			||||||
 | 
					                    case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')";
 | 
				
			||||||
 | 
					                    case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')";
 | 
				
			||||||
 | 
					                    case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')";
 | 
				
			||||||
 | 
					                    case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')";
 | 
				
			||||||
 | 
					                    case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')";
 | 
				
			||||||
 | 
					                    case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))";
 | 
				
			||||||
 | 
					                    case "ParseExact":
 | 
				
			||||||
 | 
					                    case "TryParse":
 | 
				
			||||||
 | 
					                    case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var left = getExp(exp.Object);
 | 
				
			||||||
 | 
					                var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]);
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case "Add": return $"({left}+{args1})";
 | 
				
			||||||
 | 
					                    case "Subtract": return $"({left}-({args1}))";
 | 
				
			||||||
 | 
					                    case "Equals": return $"({left} = {args1})";
 | 
				
			||||||
 | 
					                    case "CompareTo": return $"extract(day from ({left}-({args1})))";
 | 
				
			||||||
 | 
					                    case "ToString": return $"to_char({left})";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Func<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
				
			||||||
 | 
					            if (exp.Object == null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                switch (exp.Method.Name)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //case "ToBoolean": return $"({getExp(exp.Arguments[0])} not in ('0','false'))";
 | 
				
			||||||
 | 
					                    case "ToByte": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                    case "ToChar": return $"substr(to_char({getExp(exp.Arguments[0])}), 1, 1)";
 | 
				
			||||||
 | 
					                    case "ToDateTime": return $"to_timestamp({getExp(exp.Arguments[0])},'YYYY-MM-DD HH24:MI:SS.FF6')";
 | 
				
			||||||
 | 
					                    case "ToDecimal": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                    case "ToDouble": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                    case "ToInt16":
 | 
				
			||||||
 | 
					                    case "ToInt32":
 | 
				
			||||||
 | 
					                    case "ToInt64":
 | 
				
			||||||
 | 
					                    case "ToSByte": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                    case "ToSingle": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                    case "ToString": return $"to_char({getExp(exp.Arguments[0])})";
 | 
				
			||||||
 | 
					                    case "ToUInt16":
 | 
				
			||||||
 | 
					                    case "ToUInt32":
 | 
				
			||||||
 | 
					                    case "ToUInt64": return $"cast({getExp(exp.Arguments[0])} as number)";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								Providers/FreeSql.Provider.Dameng/DamengExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Providers/FreeSql.Provider.Dameng/DamengExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					public static partial class FreeSqlDamengGlobalExtensions
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    /// <param name="that"></param>
 | 
				
			||||||
 | 
					    /// <param name="args"></param>
 | 
				
			||||||
 | 
					    /// <returns></returns>
 | 
				
			||||||
 | 
					    public static string FormatDameng(this string that, params object[] args) => _damengAdo.Addslashes(that, args);
 | 
				
			||||||
 | 
					    static FreeSql.Dameng.DamengAdo _damengAdo = new FreeSql.Dameng.DamengAdo();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										61
									
								
								Providers/FreeSql.Provider.Dameng/DamengProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								Providers/FreeSql.Provider.Dameng/DamengProvider.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					using FreeSql.Dameng.Curd;
 | 
				
			||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.CommonProvider;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Threading;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class DamengProvider<TMark> : IFreeSql<TMark>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public ISelect<T1> Select<T1>() where T1 : class => new DamengSelect<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, null);
 | 
				
			||||||
 | 
					        public ISelect<T1> Select<T1>(object dywhere) where T1 : class => new DamengSelect<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
				
			||||||
 | 
					        public IInsert<T1> Insert<T1>() where T1 : class => new DamengInsert<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
				
			||||||
 | 
					        public IInsert<T1> Insert<T1>(T1 source) where T1 : class => this.Insert<T1>().AppendData(source);
 | 
				
			||||||
 | 
					        public IInsert<T1> Insert<T1>(T1[] source) where T1 : class => this.Insert<T1>().AppendData(source);
 | 
				
			||||||
 | 
					        public IInsert<T1> Insert<T1>(List<T1> source) where T1 : class => this.Insert<T1>().AppendData(source);
 | 
				
			||||||
 | 
					        public IInsert<T1> Insert<T1>(IEnumerable<T1> source) where T1 : class => this.Insert<T1>().AppendData(source);
 | 
				
			||||||
 | 
					        public IUpdate<T1> Update<T1>() where T1 : class => new DamengUpdate<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, null);
 | 
				
			||||||
 | 
					        public IUpdate<T1> Update<T1>(object dywhere) where T1 : class => new DamengUpdate<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
				
			||||||
 | 
					        public IDelete<T1> Delete<T1>() where T1 : class => new DamengDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, null);
 | 
				
			||||||
 | 
					        public IDelete<T1> Delete<T1>(object dywhere) where T1 : class => new DamengDelete<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public IAdo Ado { get; }
 | 
				
			||||||
 | 
					        public IAop Aop { get; }
 | 
				
			||||||
 | 
					        public ICodeFirst CodeFirst { get; }
 | 
				
			||||||
 | 
					        public IDbFirst DbFirst { get; }
 | 
				
			||||||
 | 
					        public DamengProvider(string masterConnectionString, string[] slaveConnectionString, Func<DbConnection> connectionFactory = null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.InternalCommonUtils = new DamengUtils(this);
 | 
				
			||||||
 | 
					            this.InternalCommonExpression = new DamengExpression(this.InternalCommonUtils);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.Ado = new DamengAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString, connectionFactory);
 | 
				
			||||||
 | 
					            this.Aop = new AopProvider();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.DbFirst = new DamengDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
				
			||||||
 | 
					            this.CodeFirst = new DamengCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal CommonUtils InternalCommonUtils { get; }
 | 
				
			||||||
 | 
					        internal CommonExpression InternalCommonExpression { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void Transaction(Action handler) => Ado.Transaction(handler);
 | 
				
			||||||
 | 
					        public void Transaction(TimeSpan timeout, Action handler) => Ado.Transaction(timeout, handler);
 | 
				
			||||||
 | 
					        public void Transaction(IsolationLevel isolationLevel, TimeSpan timeout, Action handler) => Ado.Transaction(isolationLevel, timeout, handler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ~DamengProvider() => this.Dispose();
 | 
				
			||||||
 | 
					        int _disposeCounter;
 | 
				
			||||||
 | 
					        public void Dispose()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (Interlocked.Increment(ref _disposeCounter) != 1) return;
 | 
				
			||||||
 | 
					            (this.Ado as AdoProvider)?.Dispose();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										102
									
								
								Providers/FreeSql.Provider.Dameng/DamengUtils.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								Providers/FreeSql.Provider.Dameng/DamengUtils.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
				
			|||||||
 | 
					using Dm;
 | 
				
			||||||
 | 
					using FreeSql.Internal;
 | 
				
			||||||
 | 
					using FreeSql.Internal.Model;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Dameng
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class DamengUtils : CommonUtils
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DamengUtils(IFreeSql orm) : base(orm)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
 | 
				
			||||||
 | 
					            var dbtype = (DmDbType)_orm.CodeFirst.GetDbInfo(type)?.type;
 | 
				
			||||||
 | 
					            switch (dbtype)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case DmDbType.Bit:
 | 
				
			||||||
 | 
					                    if (value == null) value = null;
 | 
				
			||||||
 | 
					                    else value = (bool)value == true ? 1 : 0;
 | 
				
			||||||
 | 
					                    dbtype = DmDbType.Int32;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					               
 | 
				
			||||||
 | 
					                case DmDbType.Char:
 | 
				
			||||||
 | 
					                case DmDbType.VarChar:
 | 
				
			||||||
 | 
					                case DmDbType.Text:
 | 
				
			||||||
 | 
					                    value = string.Concat(value);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            var ret = new DmParameter { ParameterName = QuoteParamterName(parameterName), DmSqlType = dbtype, Value = value };
 | 
				
			||||||
 | 
					            _params?.Add(ret);
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override DbParameter[] GetDbParamtersByObject(string sql, object obj) =>
 | 
				
			||||||
 | 
					            Utils.GetDbParamtersByObject<DmParameter>(sql, obj, null, (name, type, value) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var dbtype = (DmDbType)_orm.CodeFirst.GetDbInfo(type)?.type;
 | 
				
			||||||
 | 
					                switch (dbtype)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    case DmDbType.Bit:
 | 
				
			||||||
 | 
					                        if (value == null) value = null;
 | 
				
			||||||
 | 
					                        else value = (bool)value == true ? 1 : 0;
 | 
				
			||||||
 | 
					                        dbtype = DmDbType.Int32;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    case DmDbType.Char:
 | 
				
			||||||
 | 
					                    case DmDbType.VarChar:
 | 
				
			||||||
 | 
					                    case DmDbType.Text:
 | 
				
			||||||
 | 
					                        value = string.Concat(value);
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                var ret = new DmParameter { ParameterName = $":{name}", DmSqlType = dbtype, Value = value };
 | 
				
			||||||
 | 
					                return ret;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string FormatSql(string sql, params object[] args) => sql?.FormatDameng(args);
 | 
				
			||||||
 | 
					        public override string QuoteSqlName(params string[] name)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (name.Length == 1)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var nametrim = name[0].Trim();
 | 
				
			||||||
 | 
					                if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
 | 
				
			||||||
 | 
					                    return nametrim; //原生SQL
 | 
				
			||||||
 | 
					                if (nametrim.StartsWith("\"") && nametrim.EndsWith("\""))
 | 
				
			||||||
 | 
					                    return nametrim;
 | 
				
			||||||
 | 
					                return $"\"{nametrim.Replace(".", "\".\"")}\"";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return $"\"{string.Join("\".\"", name)}\"";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string TrimQuoteSqlName(string name)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var nametrim = name.Trim();
 | 
				
			||||||
 | 
					            if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
 | 
				
			||||||
 | 
					                return nametrim; //原生SQL
 | 
				
			||||||
 | 
					            return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2);
 | 
				
			||||||
 | 
					        public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
 | 
				
			||||||
 | 
					        public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
 | 
				
			||||||
 | 
					        public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
 | 
				
			||||||
 | 
					        public override string Mod(string left, string right, Type leftType, Type rightType) => $"mod({left}, {right})";
 | 
				
			||||||
 | 
					        public override string Div(string left, string right, Type leftType, Type rightType) => $"trunc({left} / {right})";
 | 
				
			||||||
 | 
					        public override string Now => "systimestamp";
 | 
				
			||||||
 | 
					        public override string NowUtc => "getutcdate";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
 | 
				
			||||||
 | 
					        public override string QuoteReadColumn(Type type, Type mapType, string columnName) => columnName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, Type type, object value)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (value == null) return "NULL";
 | 
				
			||||||
 | 
					            if (type == typeof(byte[])) return $"hextoraw('{CommonUtils.BytesSqlRaw(value as byte[])}')";
 | 
				
			||||||
 | 
					            return FormatSql("{0}", value, 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					<Project Sdk="Microsoft.NET.Sdk">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <PropertyGroup>
 | 
				
			||||||
 | 
					    <TargetFrameworks>netstandard2.0;net45;net40</TargetFrameworks>
 | 
				
			||||||
 | 
					    <Version>1.4.0-preview0414</Version>
 | 
				
			||||||
 | 
					    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
 | 
				
			||||||
 | 
					    <Authors>YeXiangQin</Authors>
 | 
				
			||||||
 | 
					    <Description>FreeSql 数据库实现,基于 达梦数据库 Ado.net (DmProvider)</Description>
 | 
				
			||||||
 | 
					    <PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
 | 
				
			||||||
 | 
					    <RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
 | 
				
			||||||
 | 
					    <RepositoryType>git</RepositoryType>
 | 
				
			||||||
 | 
					    <PackageLicenseExpression>MIT</PackageLicenseExpression>
 | 
				
			||||||
 | 
					    <PackageTags>FreeSql;ORM;DM8;Dameng;达梦</PackageTags>
 | 
				
			||||||
 | 
					    <PackageId>$(AssemblyName)</PackageId>
 | 
				
			||||||
 | 
					    <PackageIcon>logo.png</PackageIcon>
 | 
				
			||||||
 | 
					    <Title>$(AssemblyName)</Title>
 | 
				
			||||||
 | 
					    <IsPackable>true</IsPackable>
 | 
				
			||||||
 | 
					    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <None Include="../../logo.png" Pack="true" PackagePath="\" />
 | 
				
			||||||
 | 
					    <None Include="lib\DmProvider\netstandard2.0\DmProvider.dll" Pack="true" PackagePath="\lib\netstandard2.0\" />
 | 
				
			||||||
 | 
					    <None Include="lib\DmProvider\net20\DmProvider.dll" Pack="true" PackagePath="\lib\net45\" />
 | 
				
			||||||
 | 
					    <None Include="lib\DmProvider\net20\DmProvider.dll" Pack="true" PackagePath="\lib\net40\" />
 | 
				
			||||||
 | 
					    <None Include="lib/**/*.dll">
 | 
				
			||||||
 | 
					      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 | 
				
			||||||
 | 
					    </None>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <Reference Include="DmProvider">
 | 
				
			||||||
 | 
					      <HintPath>lib\DmProvider\netstandard2.0\DmProvider.dll</HintPath>
 | 
				
			||||||
 | 
					      <Private>false</Private>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
 | 
				
			||||||
 | 
					    <DefineConstants>ns20;netstandard20</DefineConstants>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(TargetFramework)' == 'net40'">
 | 
				
			||||||
 | 
					    <DefineConstants>net40</DefineConstants>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
 | 
				
			||||||
 | 
					  <metadata>
 | 
				
			||||||
 | 
					    <id>DmProvider</id>
 | 
				
			||||||
 | 
					    <version>1.1.0</version>
 | 
				
			||||||
 | 
					    <authors>DM</authors>
 | 
				
			||||||
 | 
					    <owners>DM</owners>
 | 
				
			||||||
 | 
					    <requireLicenseAcceptance>false</requireLicenseAcceptance>
 | 
				
			||||||
 | 
					    <description>DM .NET PROVIDER</description>
 | 
				
			||||||
 | 
					    <copyright>Copy right(C) DM</copyright>
 | 
				
			||||||
 | 
					    <dependencies>
 | 
				
			||||||
 | 
					      <group targetFramework=".NETFramework2.0" />
 | 
				
			||||||
 | 
					      <group targetFramework=".NETStandard2.0">
 | 
				
			||||||
 | 
					        <dependency id="System.Text.Encoding.CodePages" version="4.4.0" exclude="Build,Analyzers" />
 | 
				
			||||||
 | 
					      </group>
 | 
				
			||||||
 | 
					    </dependencies>
 | 
				
			||||||
 | 
					    <frameworkAssemblies>
 | 
				
			||||||
 | 
					      <frameworkAssembly assemblyName="System.Transactions" targetFramework=".NETFramework2.0" />
 | 
				
			||||||
 | 
					    </frameworkAssemblies>
 | 
				
			||||||
 | 
					  </metadata>
 | 
				
			||||||
 | 
					</package>
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -125,60 +125,60 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override ISelect<T1, T2> From<T2>(Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2> From<T2>(Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3> From<T2, T3>(Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3> From<T2, T3>(Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4> From<T2, T3, T4>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4> From<T2, T3, T4>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5, T6>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5, T6>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
					        public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp) { this.InternalFrom(exp); var ret = new OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(_orm, _commonUtils, _commonExpression, null); OdbcDamengSelect<T1>.CopyData(this, ret, exp?.Parameters); return ret; }
 | 
				
			||||||
        public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class
 | 
					    class OdbcDamengSelect<T1, T2> : FreeSql.Internal.CommonProvider.Select2Provider<T1, T2> where T1 : class where T2 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3> : FreeSql.Internal.CommonProvider.Select3Provider<T1, T2, T3> where T1 : class where T2 : class where T3 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4> : FreeSql.Internal.CommonProvider.Select4Provider<T1, T2, T3, T4> where T1 : class where T2 : class where T3 : class where T4 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5> : FreeSql.Internal.CommonProvider.Select5Provider<T1, T2, T3, T4, T5> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5, T6> : FreeSql.Internal.CommonProvider.Select6Provider<T1, T2, T3, T4, T5, T6> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7> : FreeSql.Internal.CommonProvider.Select7Provider<T1, T2, T3, T4, T5, T6, T7> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8> : FreeSql.Internal.CommonProvider.Select8Provider<T1, T2, T3, T4, T5, T6, T7, T8> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> : FreeSql.Internal.CommonProvider.Select9Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    class OdbcOracleSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class
 | 
					    class OdbcDamengSelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : FreeSql.Internal.CommonProvider.Select10Provider<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public OdbcOracleSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
					        public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }
 | 
				
			||||||
        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
					        public override string ToSql(string field = null) => OdbcDamengSelect<T1>.ToSqlStatic(_commonUtils, _commonExpression, _select, _distinct, field ?? this.GetAllFieldExpressionTreeLevel2().Field, _join, _where, _groupby, _having, _orderby, _skip, _limit, _tables, this.GetTableRuleUnions(), _aliasRule, _tosqlAppendContent, _whereCascadeExpression, _orm);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            this.availableHandler = availableHandler;
 | 
					            this.availableHandler = availableHandler;
 | 
				
			||||||
            this.unavailableHandler = unavailableHandler;
 | 
					            this.unavailableHandler = unavailableHandler;
 | 
				
			||||||
            var policy = new OdbcOracleConnectionPoolPolicy
 | 
					            var policy = new OdbcDamengConnectionPoolPolicy
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _pool = this,
 | 
					                _pool = this,
 | 
				
			||||||
                Name = name
 | 
					                Name = name
 | 
				
			||||||
@@ -62,7 +62,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class OdbcOracleConnectionPoolPolicy : IPolicy<DbConnection>
 | 
					    class OdbcDamengConnectionPoolPolicy : IPolicy<DbConnection>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        internal OdbcDamengConnectionPool _pool;
 | 
					        internal OdbcDamengConnectionPool _pool;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,7 +114,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                //codefirst 不支持表名中带 .
 | 
					                //codefirst 不支持表名中带 .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库
 | 
					                if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库
 | 
				
			||||||
                    throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");
 | 
					                    throw new NotImplementedException($"达梦 CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sbalter = new StringBuilder();
 | 
					                var sbalter = new StringBuilder();
 | 
				
			||||||
                var istmpatler = false; //创建临时表,导入数据,删除旧表,修改
 | 
					                var istmpatler = false; //创建临时表,导入数据,删除旧表,修改
 | 
				
			||||||
@@ -200,7 +200,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname);
 | 
				
			|||||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a =>
 | 
					                var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var sqlType = GetOracleSqlTypeFullName(a);
 | 
					                    var sqlType = GetDamengSqlTypeFullName(a);
 | 
				
			||||||
                    return new
 | 
					                    return new
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        column = string.Concat(a[0]),
 | 
					                        column = string.Concat(a[0]),
 | 
				
			||||||
@@ -436,7 +436,7 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and
 | 
				
			|||||||
            return sb.Length == 0 ? null : sb.Insert(0, "BEGIN \r\n").Insert(0, sbDeclare.ToString()).Append("END;").ToString();
 | 
					            return sb.Length == 0 ? null : sb.Insert(0, "BEGIN \r\n").Insert(0, sbDeclare.ToString()).Append("END;").ToString();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        internal static string GetOracleSqlTypeFullName(object[] row)
 | 
					        internal static string GetDamengSqlTypeFullName(object[] row)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var a = row;
 | 
					            var a = row;
 | 
				
			||||||
            var sqlType = string.Concat(a[1]).ToUpper();
 | 
					            var sqlType = string.Concat(a[1]).ToUpper();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]);
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]);
 | 
				
			||||||
                    return OdbcType.Bit;
 | 
					                    return OdbcType.Bit;
 | 
				
			||||||
                case "smallint":
 | 
					                case "smallint":
 | 
				
			||||||
                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(5)"]);
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(4)"]);
 | 
				
			||||||
                    return OdbcType.SmallInt;
 | 
					                    return OdbcType.SmallInt;
 | 
				
			||||||
                case "byte":
 | 
					                case "byte":
 | 
				
			||||||
                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(3)"]);
 | 
					                    _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(3)"]);
 | 
				
			||||||
@@ -323,7 +323,7 @@ where a.owner in ({1}) and {0}
 | 
				
			|||||||
                ds2item[0] = row[0];
 | 
					                ds2item[0] = row[0];
 | 
				
			||||||
                ds2item[1] = row[1];
 | 
					                ds2item[1] = row[1];
 | 
				
			||||||
                ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", "");
 | 
					                ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", "");
 | 
				
			||||||
                ds2item[4] = OdbcDamengCodeFirst.GetOracleSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] });
 | 
					                ds2item[4] = OdbcDamengCodeFirst.GetDamengSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] });
 | 
				
			||||||
                ds2item[5] = string.Concat(row[7]) == "1";
 | 
					                ds2item[5] = string.Concat(row[7]) == "1";
 | 
				
			||||||
                ds2item[6] = string.Concat(row[8]) == "1";
 | 
					                ds2item[6] = string.Concat(row[8]) == "1";
 | 
				
			||||||
                ds2item[7] = string.Concat(row[9]);
 | 
					                ds2item[7] = string.Concat(row[9]);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,12 +38,6 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            this.DbFirst = new OdbcDamengDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
					            this.DbFirst = new OdbcDamengDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
				
			||||||
            this.CodeFirst = new OdbcDamengCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
					            this.CodeFirst = new OdbcDamengCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
 | 
				
			||||||
 | 
					 | 
				
			||||||
            //this.Aop.AuditValue += new EventHandler<Aop.AuditValueEventArgs>((_, e) =>
 | 
					 | 
				
			||||||
            //{
 | 
					 | 
				
			||||||
            //    if (e.Value == null && e.Column.Attribute.IsPrimary == false && e.Column.Attribute.IsIdentity == false)
 | 
					 | 
				
			||||||
            //        e.Value = Utils.GetDataReaderValue(e.Property.PropertyType.NullableTypeOrThis(), e.Column.Attribute.DbDefautValue);
 | 
					 | 
				
			||||||
            //});
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        internal CommonUtils InternalCommonUtils { get; }
 | 
					        internal CommonUtils InternalCommonUtils { get; }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,7 +65,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcOracle(args);
 | 
					        public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcDameng(args);
 | 
				
			||||||
        public override string QuoteSqlName(params string[] name)
 | 
					        public override string QuoteSqlName(params string[] name)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (name.Length == 1)
 | 
					            if (name.Length == 1)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user