mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 完善 $"{id}_{name}" lambda 解析与测试;
This commit is contained in:
		@@ -125,6 +125,13 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </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>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -479,5 +486,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.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>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,29 @@ namespace FreeSql.Tests.MySqlConnectorExpression
 | 
				
			|||||||
            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
					            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.mysql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT concat('x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as1, concat('',(a.`Id` + 1),'x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as2 
 | 
				
			||||||
 | 
					FROM `tb_topic` a 
 | 
				
			||||||
 | 
					WHERE (a.`Id` = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,8 +162,8 @@ namespace FreeSql.Tests.Odbc.DamengExpression
 | 
				
			|||||||
        public void Random()
 | 
					        public void Random()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var data = new List<object>();
 | 
					            var data = new List<object>();
 | 
				
			||||||
            data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList());
 | 
					            data.Add(select.OrderBy(a => new Random().Next()).Limit(10).ToList());
 | 
				
			||||||
            data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList());
 | 
					            data.Add(select.OrderBy(a => new Random().NextDouble()).Limit(10).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.Odbc.DamengExpression
 | 
				
			|||||||
            list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.dameng.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.Odbc.KingbaseESExpression
 | 
				
			|||||||
            list.Add(g.kingbaseES.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.kingbaseES.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.kingbaseES.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char((a.""CREATETIME"")::timestamp,'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char((a.""CREATETIME"")::timestamp,'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,29 @@ namespace FreeSql.Tests.Odbc.MySqlExpression
 | 
				
			|||||||
            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
					            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.mysql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT concat('x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as1, concat('',(a.`Id` + 1),'x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as2 
 | 
				
			||||||
 | 
					FROM `tb_topic` a 
 | 
				
			||||||
 | 
					WHERE (a.`Id` = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.Odbc.OracleExpression
 | 
				
			|||||||
            list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.oracle.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.Odbc.PostgreSQLExpression
 | 
				
			|||||||
            list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.pgsql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""id"" + 1))||'z-'||(to_char((a.""createtime"")::timestamp,'YYYYMM'))||''||(a.""title"")||'' as1, ''||((a.""id"" + 1))||'x'||((a.""id"" + 1))||'z-'||(to_char((a.""createtime"")::timestamp,'YYYYMM'))||''||(a.""title"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""tb_topic"" a 
 | 
				
			||||||
 | 
					WHERE (a.""id"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,6 +51,29 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression
 | 
				
			|||||||
            list.Add(g.sqlserver.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.sqlserver.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.sqlserver.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT N'x'+cast((a.[Id] + 1) as varchar)+N'z-'+(substring(convert(char(8), cast(a.[CreateTime] as datetime), 112), 1, 6))+N''+(a.[Title])+N'' as1, N''+cast((a.[Id] + 1) as varchar)+N'x'+cast((a.[Id] + 1) as varchar)+N'z-'+(substring(convert(char(8), cast(a.[CreateTime] as datetime), 112), 1, 6))+N''+(a.[Title])+N'' as2 
 | 
				
			||||||
 | 
					FROM [tb_topic] a 
 | 
				
			||||||
 | 
					WHERE (a.[Id] = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,8 +162,8 @@ namespace FreeSql.Tests.DamengExpression
 | 
				
			|||||||
        public void Random()
 | 
					        public void Random()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var data = new List<object>();
 | 
					            var data = new List<object>();
 | 
				
			||||||
            data.Add(select.Where(a => new Random().Next() > a.Clicks).Limit(10).ToList());
 | 
					            data.Add(select.OrderBy(a => new Random().Next()).Limit(10).ToList());
 | 
				
			||||||
            data.Add(select.Where(a => new Random().NextDouble() > a.Clicks).Limit(10).ToList());
 | 
					            data.Add(select.OrderBy(a => new Random().NextDouble()).Limit(10).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.DamengExpression
 | 
				
			|||||||
            list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.dameng.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.dameng.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,29 @@ namespace FreeSql.Tests.MsAccessExpression
 | 
				
			|||||||
            list.Add(g.msaccess.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.msaccess.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.msaccess.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'+cstr((a.[Id] + 1))+'z-'+(format(a.[CreateTime],'yyyyMM'))+''+(a.[Title])+'' as as1, ''+cstr((a.[Id] + 1))+'x'+cstr((a.[Id] + 1))+'z-'+(format(a.[CreateTime],'yyyyMM'))+''+(a.[Title])+'' as as2 
 | 
				
			||||||
 | 
					FROM [tb_topic] a 
 | 
				
			||||||
 | 
					WHERE (a.[Id] = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,29 @@ namespace FreeSql.Tests.MySqlExpression
 | 
				
			|||||||
            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
					            list.Add(g.mysql.Select<TestEqualsGuid>().Where(a => a.IsDeleted.Equals(false)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.mysql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT concat('x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as1, concat('',(a.`Id` + 1),'x',(a.`Id` + 1),'z-',date_format(a.`CreateTime`,'%Y%m'),'',a.`Title`,'') as2 
 | 
				
			||||||
 | 
					FROM `tb_topic` a 
 | 
				
			||||||
 | 
					WHERE (a.`Id` = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.OracleExpression
 | 
				
			|||||||
            list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.oracle.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.oracle.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char(a.""CREATETIME"",'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.PostgreSQLExpression
 | 
				
			|||||||
            list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.pgsql.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.pgsql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""id"" + 1))||'z-'||(to_char((a.""createtime"")::timestamp,'YYYYMM'))||''||(a.""title"")||'' as1, ''||((a.""id"" + 1))||'x'||((a.""id"" + 1))||'z-'||(to_char((a.""createtime"")::timestamp,'YYYYMM'))||''||(a.""title"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""tb_topic"" a 
 | 
				
			||||||
 | 
					WHERE (a.""id"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,28 @@ namespace FreeSql.Tests.ShenTongExpression
 | 
				
			|||||||
            list.Add(g.shentong.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.shentong.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.shentong.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""ID"" + 1))||'z-'||(to_char((a.""CREATETIME"")::timestamp,'YYYYMM'))||''||(a.""TITLE"")||'' as1, ''||((a.""ID"" + 1))||'x'||((a.""ID"" + 1))||'z-'||(to_char((a.""CREATETIME"")::timestamp,'YYYYMM'))||''||(a.""TITLE"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""TB_TOPIC"" a 
 | 
				
			||||||
 | 
					WHERE (a.""ID"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,6 +65,29 @@ namespace FreeSql.Tests.SqlServerExpression
 | 
				
			|||||||
            list.Add(select.Where(a => a.TitleVarchar == "aaa").ToList());
 | 
					            list.Add(select.Where(a => a.TitleVarchar == "aaa").ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.sqlserver.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT N'x'+cast((a.[Id] + 1) as varchar)+N'z-'+(substring(convert(char(8), cast(a.[CreateTime] as datetime), 112), 1, 6))+N''+(a.[Title])+N'' as1, N''+cast((a.[Id] + 1) as varchar)+N'x'+cast((a.[Id] + 1) as varchar)+N'z-'+(substring(convert(char(8), cast(a.[CreateTime] as datetime), 112), 1, 6))+N''+(a.[Title])+N'' as2 
 | 
				
			||||||
 | 
					FROM [tb_topic] a 
 | 
				
			||||||
 | 
					WHERE (a.[Id] = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,29 @@ namespace FreeSql.Tests.SqliteExpression
 | 
				
			|||||||
            list.Add(g.sqlite.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
					            list.Add(g.sqlite.Select<TestEqualsGuid>().Where(a => a.id.Equals(Guid.Empty)).ToList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void Format()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var item = g.sqlite.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>101", CreateTime = DateTime.Parse("2020-7-5") });
 | 
				
			||||||
 | 
					            var sql = select.WhereDynamic(item).ToSql(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.Equal($@"SELECT 'x'||((a.""Id"" + 1))||'z-'||(strftime('%Y%m',a.""CreateTime""))||''||(a.""Title"")||'' as1, ''||((a.""Id"" + 1))||'x'||((a.""Id"" + 1))||'z-'||(strftime('%Y%m',a.""CreateTime""))||''||(a.""Title"")||'' as2 
 | 
				
			||||||
 | 
					FROM ""tb_topic"" a 
 | 
				
			||||||
 | 
					WHERE (a.""Id"" = {item.Id})", sql);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var item2 = select.WhereDynamic(item).First(a => new
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}",
 | 
				
			||||||
 | 
					                str2 = string.Format("{0}x{0}z-{1}{2}", a.Id + 1, a.CreateTime.ToString("yyyyMM"), a.Title)
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Assert.NotNull(item2);
 | 
				
			||||||
 | 
					            Assert.Equal($"x{item.Id + 1}z-{item.CreateTime.ToString("yyyyMM")}{item.Title}", item2.str);
 | 
				
			||||||
 | 
					            Assert.Equal(string.Format("{0}x{0}z-{1}{2}", item.Id + 1, item.CreateTime.ToString("yyyyMM"), item.Title), item2.str2);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void Empty()
 | 
					        public void Empty()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -716,31 +716,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    string other3Exp = null;
 | 
					                    string other3Exp = null;
 | 
				
			||||||
                    switch (callType.FullName)
 | 
					                    switch (callType.FullName)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        case "System.String":
 | 
					                        case "System.String": other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); break;
 | 
				
			||||||
                            //$"{id}_{name}"
 | 
					 | 
				
			||||||
                            if (exp3.Method.Name == "Format" && exp3.Object == null && exp3.Arguments[0].NodeType == ExpressionType.Constant)
 | 
					 | 
				
			||||||
                            {
 | 
					 | 
				
			||||||
                                if (exp3.Arguments.Count == 1) return ExpressionLambdaToSql(exp3.Arguments[0], tsc);
 | 
					 | 
				
			||||||
                                var exp3Args0 = (exp3.Arguments[0] as ConstantExpression)?.Value?.ToString().Replace("{{", "{{_freesql_tMp_fLag_");
 | 
					 | 
				
			||||||
                                var exp3Args1n = exp3.Arguments.Where((a, z) => z > 0).Select(a => ExpressionLambdaToSql(a, tsc)).ToArray();
 | 
					 | 
				
			||||||
                                var exp3Args0Spt = Regex.Split(exp3Args0, @"{(\d+)}");
 | 
					 | 
				
			||||||
                                var exp3ArgsConcatType = new Type[exp3Args0Spt.Length];
 | 
					 | 
				
			||||||
                                exp3Args0Spt[0] = _common.FormatSql("{0}", exp3Args0Spt[0].Replace("{{_freesql_tMp_fLag_", "{{"));
 | 
					 | 
				
			||||||
                                exp3ArgsConcatType[0] = typeof(string);
 | 
					 | 
				
			||||||
                                for (var exp3Args0SptIndex = 1; exp3Args0SptIndex < exp3Args0Spt.Length; exp3Args0SptIndex += 2)
 | 
					 | 
				
			||||||
                                {
 | 
					 | 
				
			||||||
                                    var exp3Args1nIndex = int.Parse(exp3Args0Spt[exp3Args0SptIndex]);
 | 
					 | 
				
			||||||
                                    exp3Args0Spt[exp3Args0SptIndex] = exp3Args1n[exp3Args1nIndex];
 | 
					 | 
				
			||||||
                                    var expArgsType = exp3.Arguments[exp3Args1nIndex + 1];
 | 
					 | 
				
			||||||
                                    exp3ArgsConcatType[exp3Args0SptIndex] = (expArgsType as UnaryExpression)?.Operand.Type ?? expArgsType.Type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                    exp3Args0Spt[exp3Args0SptIndex + 1] = _common.FormatSql("{0}", exp3Args0Spt[exp3Args0SptIndex + 1].Replace("{{_freesql_tMp_fLag_", "{{"));
 | 
					 | 
				
			||||||
                                    exp3ArgsConcatType[exp3Args0SptIndex + 1] = typeof(string);
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                                return _common.StringConcat(exp3Args0Spt, exp3ArgsConcatType);
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                            other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); 
 | 
					 | 
				
			||||||
                            break;
 | 
					 | 
				
			||||||
                        case "System.Math": other3Exp = ExpressionLambdaToSqlCallMath(exp3, tsc); break;
 | 
					                        case "System.Math": other3Exp = ExpressionLambdaToSqlCallMath(exp3, tsc); break;
 | 
				
			||||||
                        case "System.DateTime": other3Exp = ExpressionLambdaToSqlCallDateTime(exp3, tsc); break;
 | 
					                        case "System.DateTime": other3Exp = ExpressionLambdaToSqlCallDateTime(exp3, tsc); break;
 | 
				
			||||||
                        case "System.TimeSpan": other3Exp = ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); break;
 | 
					                        case "System.TimeSpan": other3Exp = ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); break;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,7 +77,7 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
                        case "NewGuid":
 | 
					                        case "NewGuid":
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        case "Next":
 | 
					                        case "Next":
 | 
				
			||||||
                            if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)";
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as number)";
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        case "NextDouble":
 | 
					                        case "NextDouble":
 | 
				
			||||||
                            if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value";
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value";
 | 
				
			||||||
@@ -222,7 +222,7 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case "Days": return $"extract(day from {left})";
 | 
					                case "Days": return $"extract(day from {left})";
 | 
				
			||||||
                case "Hours": return $"extract(hour 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 "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)";
 | 
				
			||||||
                case "Minutes": return $"extract(minute from {left})";
 | 
					                case "Minutes": return $"extract(minute from {left})";
 | 
				
			||||||
                case "Seconds": return $"floor(extract(second 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 "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000";
 | 
				
			||||||
@@ -250,6 +250,10 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -220,6 +220,10 @@ namespace FreeSql.MsAccess
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'+{(((a as UnaryExpression)?.Operand.Type ?? a.Type) == typeof(string) ? $"({ExpressionLambdaToSql(a, tsc)})" : $"cstr({ExpressionLambdaToSql(a, tsc)})")}+'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -248,6 +248,11 @@ namespace FreeSql.MySql
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return ExpressionLambdaToSql(exp.Arguments[0], tsc);
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"',{ExpressionLambdaToSql(a, tsc)},'").ToArray();
 | 
				
			||||||
 | 
					                        return $"concat({string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs)})";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -77,7 +77,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                        case "NewGuid":
 | 
					                        case "NewGuid":
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        case "Next":
 | 
					                        case "Next":
 | 
				
			||||||
                            if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)";
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as number)";
 | 
				
			||||||
                            return null;
 | 
					                            return null;
 | 
				
			||||||
                        case "NextDouble":
 | 
					                        case "NextDouble":
 | 
				
			||||||
                            if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value";
 | 
					                            if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value";
 | 
				
			||||||
@@ -222,7 +222,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case "Days": return $"extract(day from {left})";
 | 
					                case "Days": return $"extract(day from {left})";
 | 
				
			||||||
                case "Hours": return $"extract(hour 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 "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)";
 | 
				
			||||||
                case "Minutes": return $"extract(minute from {left})";
 | 
					                case "Minutes": return $"extract(minute from {left})";
 | 
				
			||||||
                case "Seconds": return $"floor(extract(second 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 "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000";
 | 
				
			||||||
@@ -250,6 +250,10 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -314,6 +314,10 @@ namespace FreeSql.Odbc.KingbaseES
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -246,6 +246,11 @@ namespace FreeSql.Odbc.MySql
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return ExpressionLambdaToSql(exp.Arguments[0], tsc);
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"',{ExpressionLambdaToSql(a, tsc)},'").ToArray();
 | 
				
			||||||
 | 
					                        return $"concat({string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs)})";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -222,7 +222,7 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case "Days": return $"extract(day from {left})";
 | 
					                case "Days": return $"extract(day from {left})";
 | 
				
			||||||
                case "Hours": return $"extract(hour 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 "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)";
 | 
				
			||||||
                case "Minutes": return $"extract(minute from {left})";
 | 
					                case "Minutes": return $"extract(minute from {left})";
 | 
				
			||||||
                case "Seconds": return $"floor(extract(second 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 "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000";
 | 
				
			||||||
@@ -250,6 +250,10 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -336,6 +336,10 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -256,6 +256,20 @@ namespace FreeSql.Odbc.SqlServer
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs0 = ExpressionLambdaToSql(exp.Arguments[0], tsc);
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return expArgs0;
 | 
				
			||||||
 | 
					                        var nchar = expArgs0.StartsWith("N'") ? "N" : "";
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a =>
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var atype = (a as UnaryExpression)?.Operand.Type.NullableTypeOrThis() ?? a.Type.NullableTypeOrThis();
 | 
				
			||||||
 | 
					                            if (atype == typeof(string)) return $"'+({ExpressionLambdaToSql(a, tsc)})+{nchar}'";
 | 
				
			||||||
 | 
					                            if (atype == typeof(Guid)) return $"'+cast({ExpressionLambdaToSql(a, tsc)} as char(36))+{nchar}'";
 | 
				
			||||||
 | 
					                            if (atype.IsNumberType()) return $"'+cast({ExpressionLambdaToSql(a, tsc)} as varchar)+{nchar}'";
 | 
				
			||||||
 | 
					                            return $"'+cast({ExpressionLambdaToSql(a, tsc)} as nvarchar(max))+{nchar}'";
 | 
				
			||||||
 | 
					                        }).ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(expArgs0, expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -222,7 +222,7 @@ namespace FreeSql.Oracle
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                case "Days": return $"extract(day from {left})";
 | 
					                case "Days": return $"extract(day from {left})";
 | 
				
			||||||
                case "Hours": return $"extract(hour 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 "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)";
 | 
				
			||||||
                case "Minutes": return $"extract(minute from {left})";
 | 
					                case "Minutes": return $"extract(minute from {left})";
 | 
				
			||||||
                case "Seconds": return $"floor(extract(second 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 "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000";
 | 
				
			||||||
@@ -250,6 +250,10 @@ namespace FreeSql.Oracle
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -367,6 +367,10 @@ namespace FreeSql.PostgreSQL
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -297,6 +297,10 @@ namespace FreeSql.ShenTong
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -255,6 +255,20 @@ namespace FreeSql.SqlServer
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray());
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs0 = ExpressionLambdaToSql(exp.Arguments[0], tsc);
 | 
				
			||||||
 | 
					                        if (exp.Arguments.Count == 1) return expArgs0;
 | 
				
			||||||
 | 
					                        var nchar = expArgs0.StartsWith("N'") ? "N" : "";
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a =>
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            var atype = (a as UnaryExpression)?.Operand.Type.NullableTypeOrThis() ?? a.Type.NullableTypeOrThis();
 | 
				
			||||||
 | 
					                            if (atype == typeof(string)) return $"'+({ExpressionLambdaToSql(a, tsc)})+{nchar}'";
 | 
				
			||||||
 | 
					                            if (atype == typeof(Guid)) return $"'+cast({ExpressionLambdaToSql(a, tsc)} as char(36))+{nchar}'";
 | 
				
			||||||
 | 
					                            if (atype.IsNumberType()) return $"'+cast({ExpressionLambdaToSql(a, tsc)} as varchar)+{nchar}'";
 | 
				
			||||||
 | 
					                            return $"'+cast({ExpressionLambdaToSql(a, tsc)} as nvarchar(max))+{nchar}'";
 | 
				
			||||||
 | 
					                        }).ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(expArgs0, expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -246,6 +246,10 @@ namespace FreeSql.Sqlite
 | 
				
			|||||||
                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
					                        return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')";
 | 
				
			||||||
                    case "Concat":
 | 
					                    case "Concat":
 | 
				
			||||||
                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
					                        return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null);
 | 
				
			||||||
 | 
					                    case "Format":
 | 
				
			||||||
 | 
					                        if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception($"未实现函数表达式 {exp} 解析,参数 {exp.Arguments[0]} 必须为常量");
 | 
				
			||||||
 | 
					                        var expArgs = exp.Arguments.Where((a, z) => z > 0).Select(a => $"'||({ExpressionLambdaToSql(a, tsc)})||'").ToArray();
 | 
				
			||||||
 | 
					                        return string.Format(ExpressionLambdaToSql(exp.Arguments[0], tsc), expArgs);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user