using FreeSql; using FreeSql.DataAnnotations; using kwlib; using Microsoft.Data.SqlClient; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using Xunit; namespace FreeSql.Tests { public class UnitTest2 { public partial class SysModulePermission { /// /// 菜单权限ID /// [Column(IsPrimary = true, OldName = "SysModulePermissionId")] public String Id { get; set; } /// /// 菜单主键ID /// public String SysModuleId { get; set; } /// /// 按钮主键ID /// public String SysModuleButtonId { get; set; } /// /// 菜单权限 /// public Int32 Status { get; set; } } public partial class SysModule { /// /// 主键 /// [Column(IsPrimary = true, OldName = "SysModuleId")] public String Id { get; set; } /// /// 父级ID /// public String ParentId { get; set; } /// /// 名称 /// public String Name { get; set; } /// /// 图标 /// public String Icon { get; set; } /// /// 链接地址 /// public String UrlAddress { get; set; } /// /// 是否公开 /// public Int32 IsShow { get; set; } /// /// 排序 /// public Int32? Sort { get; set; } /// /// 备注 /// public String Description { get; set; } /// /// 创建日期 /// public DateTime CreateTime { get; set; } } public partial class SysModuleButton { /// /// 按钮主键 /// [Column(IsPrimary = true, OldName = "SysModuleButtonId")] public String Id { get; set; } /// /// 名称 /// public String Name { get; set; } /// /// 事件名称 /// public String EventName { get; set; } /// /// 编码 /// public String EnCode { get; set; } /// /// 图标 /// public String Icon { get; set; } /// /// 排序 /// public Int32? Sort { get; set; } /// /// 创建日期 /// public DateTime CreateTime { get; set; } } partial class SysModulePermission { [Navigate("SysModuleButtonId")] public SysModuleButton Button { get; set; } } partial class SysModule { [Navigate("SysModuleId")] public List Permissions { get; set; } } partial class SysModuleButton { } public class LinUser { public long id { get; set; } public string name { get; set; } public string nick { get; set; } } public class Comment { public Guid Id { get; set; } /// /// 回复的文本内容 /// public string Text { get; set; } [Navigate("CreateUserId")] public LinUser UserInfo { get; set; } public long? CreateUserId { get; set; } } public class UserLike { public Guid Id { get; set; } public Guid SubjectId { get; set; } public long? CreateUserId { get; set; } } public class TestMySqlStringIsNullable { public Guid id { get; set; } public string nvarchar { get; set; } [Column(IsNullable = true)] public string nvarchar_null { get; set; } [Column(IsNullable = false)] public string nvarchar_notnull { get; set; } [Column(DbType = "varchar(100)")] public string varchar { get; set; } [Column(IsNullable = true, DbType = "varchar(100)")] public string varchar_null { get; set; } [Column(IsNullable = false, DbType = "varchar(100)")] public string varchar_notnull { get; set; } } public class TestIgnoreDefaultValue { public Guid Id { get; set; } [Column(IsIgnore = true)] public double? quantity { get; set; } = 100f; public DateTime ct1 { get; set; } public DateTime? ct2 { get; set; } } public class TBatInst { public Guid Id { get; set; } public string Name { get; set; } } public class gf_t1 { public Guid id { get; set; } public int rowstate { get; set; } } public class gf_t2 { public Guid id { get; set; } public decimal rowstate { get; set; } } public class gf_t3 { public Guid id { get; set; } public decimal rowstate { get; set; } } public class gfDto { public int rowstate { get; set; } public dfDto2 dto2 { get; set; } } public class dfDto2 { public int id { get; set; } public decimal rowstate { get; set; } } public class otot1 { [Column(IsIdentity = true)] public int id { get; set; } public string name { get; set; } public otot2 t2 { get; set; } } public class otot2 { [Column(IsIdentity = true)] public int id { get; set; } public string title { get; set; } } public class otot3 : otot1 { } [Fact] public void Test02() { g.sqlite.GlobalFilter .ApplyOnly("id1", a => a.name == "123"); var sqlonly = g.sqlite.Select() .InnerJoin((a, b, c) => a.id == b.id) .InnerJoin((a, b, c) => b.id == c.id) .ToSql(); g.sqlite.Update(Guid.Empty).Set(a => a.ct1 == a.ct2).ExecuteAffrows(); g.sqlite.Insert(new otot1 { name = "otot1_name1" }).ExecuteAffrows(); var otolst1 = g.sqlite.Select() .LeftJoin(a => a.id == a.t2.id) .ToList(); var otolst2 = g.sqlite.Select() .LeftJoin((a, b) => a.id == b.id) .ToList((a, b) => new { a, b }); var testcf = g.sqlite.CodeFirst.GetComparisonDDLStatements(typeof(dfDto2), "main.test2"); var u1 = new userinfo { name = "111", departments = new List(new[]{ new departments { deptname = "dep1" }, new departments { deptname = "dep1" } }) }; var kwrepo = g.sqlite.GetRepository(); kwrepo.Insert(u1); g.sqlite.GlobalFilter.ApplyIf("random_filter", () => new Random().Next(0, 2) % 2 == 0 ? true : false, a => a.rowstate > 0); Enumerable.Range(0, 10).ToList().ForEach(aidx => { var sql1 = g.sqlite.Select().ToSql(); }); g.sqlite.GlobalFilter.Apply("gft1", a => a.rowstate > -1 && g.sqlite.Select().Any(b => b.id == a.id)) .Apply("gft2", a => a.rowstate > -2) .Apply("gft3", a => a.rowstate > -3) .Apply("gft11", a => a.rowstate > -1); var tksk1 = g.sqlite.Select() .InnerJoin((a, b, c) => a.id == b.id) .Where((a, b, c) => c.rowstate > 10) .ToList(); g.sqlite.Update().NoneParameter().Set(a => a.rowstate + 1).Where(a => a.rowstate >= 0).ExecuteAffrows(); var tksk2 = g.sqlite.Select() .InnerJoin((a, b, c) => a.id == b.id) .Where((a, b, c) => c.rowstate > 10) .ToList(); g.sqlite.Update().NoneParameter().Set(a => a.rowstate + 1).Where(a => a.rowstate >= 0).ExecuteAffrows(); var dddd2sql1 = g.sqlite.Select() .DisableGlobalFilter() .ToUpdate() //.DisableGlobalFilter() .Set(a => a.rowstate, 10) .ToSql(); var dtot2 = g.sqlite.Select().ToList(a => new gfDto { dto2 = new dfDto2 { rowstate = a.rowstate } }); var repo_dtot22 = g.sqlite.GetRepository(); var dtot221 = repo_dtot22.Select.ToList(a => new gfDto { dto2 = new dfDto2 { rowstate = a.rowstate } }); repo_dtot22.DbContextOptions.EnableGlobalFilter = false; var dtot222 = repo_dtot22.Select.ToList(a => new gfDto { dto2 = new dfDto2 { rowstate = a.rowstate } }); //List<(Guid, DateTime)> contains2linqarr = new List<(Guid, DateTime)>(); //Assert.Equal("SELECT 1 as1 FROM \"TestIgnoreDefaultValue\" a WHERE (1=0)", g.sqlite.Select().Where(a => contains2linqarr.Contains(a.Id, a.ct1)).ToSql(a => 1).Replace("\r\n", "")); //g.sqlite.Select().Where(a => contains2linqarr.Contains(a.Id, a.ct1)).ToList(); //contains2linqarr.Add((Guid.NewGuid(), DateTime.Now)); //contains2linqarr.Add((Guid.NewGuid(), DateTime.Now)); //contains2linqarr.Add((Guid.NewGuid(), DateTime.Now)); //g.sqlite.Select() // .Where(a => contains2linqarr.Contains(a.Id, a.ct1)).ToList(); //List<(Guid, DateTime, DateTime?)> contains3linqarr = new List<(Guid, DateTime, DateTime?)>(); //Assert.Equal("SELECT 1 as1 FROM \"TestIgnoreDefaultValue\" a WHERE (1=0)", g.sqlite.Select().Where(a => contains3linqarr.Contains(a.Id, a.ct1, a.ct2)).ToSql(a => 1).Replace("\r\n", "")); //g.sqlite.Select().Where(a => contains3linqarr.Contains(a.Id, a.ct1, a.ct2)).ToList(); //contains3linqarr.Add((Guid.NewGuid(), DateTime.Now, DateTime.Now)); //contains3linqarr.Add((Guid.NewGuid(), DateTime.Now, DateTime.Now)); //contains3linqarr.Add((Guid.NewGuid(), DateTime.Now, DateTime.Now)); //g.sqlite.Select().Where(a => contains3linqarr.Contains(a.Id, a.ct1, a.ct2)).ToList(); var start = DateTime.Now.Date; var end = DateTime.Now.AddDays(1).Date.AddMilliseconds(-1); var textbetween = g.sqlite.Select() .Where(a => a.ct1.Between(start, end)) .ToList(); var textbetweenend = g.sqlite.Select() .Where(a => a.ct1.BetweenEnd(start, end)) .ToList(); g.mysql.GlobalFilter.Apply("gft1", a => a.rowstate > -1) .Apply("gft2", a => a.rowstate > -2) .Apply("gft3", a => a.rowstate > -3); var gft1 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); var gft2 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); var gft3 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); var repo1 = g.mysql.GetRepository(); using (repo1.DataFilter.Disable("gft1", "gft2", "gft3")) repo1.Get(Guid.NewGuid()); var repo2 = g.mysql.GetRepository(); using (repo2.DataFilter.Disable("gft1", "gft2", "gft3")) repo2.Get(Guid.NewGuid()); var repo3 = g.mysql.GetRepository(); using (repo3.DataFilter.Disable("gft1", "gft2", "gft3")) repo3.Get(Guid.NewGuid()); g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); g.mysql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); g.oracle.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); Assert.Equal(1048, g.sqlserver.Select().Count()); Assert.Equal(1048, g.mysql.Select().Count()); Assert.Equal(1048, g.pgsql.Select().Count()); Assert.Equal(1048, g.oracle.Select().Count()); Assert.Equal(1048, g.sqlite.Select().Count()); //---- g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); g.mysql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); g.oracle.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); Assert.Equal(1048, g.sqlserver.Select().Count()); Assert.Equal(1048, g.mysql.Select().Count()); Assert.Equal(1048, g.pgsql.Select().Count()); Assert.Equal(1048, g.oracle.Select().Count()); Assert.Equal(1048, g.sqlite.Select().Count()); //---- g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); g.mysql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); g.oracle.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); Assert.Equal(3348, g.sqlserver.Select().Count()); Assert.Equal(3348, g.mysql.Select().Count()); Assert.Equal(3348, g.pgsql.Select().Count()); Assert.Equal(3348, g.oracle.Select().Count()); Assert.Equal(3348, g.sqlite.Select().Count()); //---- g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); g.mysql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); g.oracle.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); Assert.Equal(3348, g.sqlserver.Select().Count()); Assert.Equal(3348, g.mysql.Select().Count()); Assert.Equal(3348, g.pgsql.Select().Count()); Assert.Equal(3348, g.oracle.Select().Count()); Assert.Equal(3348, g.sqlite.Select().Count()); //var serverTime = g.pgsql.Select().Limit(1).First(a => DateTime.UtcNow); //var timeOffset = DateTime.UtcNow.Subtract(serverTime); //减去数据库时间 //g.pgsql.Aop.AuditValue += new EventHandler((_, e) => //{ // if (e.Column.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime)) // { // if (e.Value == null || (DateTime)e.Value == default(DateTime)) // { // e.Value = DateTime.Now.Subtract(timeOffset); // return; // } // } //}); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); g.pgsql.GetRepository().Insert(new TestIgnoreDefaultValue[] { new TestIgnoreDefaultValue(), new TestIgnoreDefaultValue(), new TestIgnoreDefaultValue() }); var testttt = g.pgsql.Select().Limit(10).ToList(); var slsksd = g.mysql.Update().SetSource(new UserLike { Id = Guid.NewGuid(), CreateUserId = 1000, SubjectId = Guid.NewGuid() }) .UpdateColumns(a => new { a.SubjectId }).NoneParameter().ToSql(); g.mysql.Aop.ParseExpression += (s, e) => { if (e.Expression.NodeType == ExpressionType.Call) { var callExp = e.Expression as MethodCallExpression; if (callExp.Object?.Type == typeof(DateTime) && callExp.Method.Name == "ToString" && callExp.Arguments.Count == 1 && callExp.Arguments[0].Type == typeof(string) && callExp.Arguments[0].NodeType == ExpressionType.Constant) { var format = (callExp.Arguments[0] as ConstantExpression)?.Value?.ToString(); if (string.IsNullOrEmpty(format) == false) { var tmp = e.FreeParse(callExp.Object); switch (format) { case "yyyy-MM-dd HH:mm": tmp = $"date_format({tmp}, '%Y-%m-%d %H:%i')"; break; } e.Result = tmp; } } } }; //var dbs = g.sqlserver.DbFirst.GetDatabases(); var tbs = g.sqlserver.DbFirst.GetTablesByDatabase("ds_shop"); var dicParamslist = g.sqlite.Select().Page(1, 10) .Where("id > @id and id > @id2 and id > @id3", new Dictionary { ["id"] = 1, ["id2"] = 2, ["id3"] = 3 }) .ToList(); var list111 = g.sqlite.Select() .Page(1, 10) .ToList(a => new { Id = a.Id }) .Select(a => new SysModule { Id = a.Id }).ToList() .IncludeMany(g.sqlite, a => a.Permissions, then => then.Include(a => a.Button)); var list222 = g.sqlite.Select() .IncludeMany(m => m.Permissions, then => then.Include(a => a.Button)) .Page(1, 10) .ToList(); var comments1 = g.mysql.Select() .LeftJoin((a, b) => a.Id == b.SubjectId) .ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo }); var comments2 = g.mysql.Select() .Include(r => r.UserInfo) .From((z, b) => z.LeftJoin(u => u.Id == b.SubjectId)) .ToList((a, b) => new { comment = a, b.SubjectId, user = a.UserInfo, testb1 = a.UserInfo == null ? 1 : 0, testb2 = a.UserInfo != null ? 2 : 0, testb4 = b == null ? 3 : 0, testb5 = b != null ? 4 : 0, }); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); g.sqlite.Delete().Where("1=1").ExecuteAffrows(); var menu1 = new SysModule { Id = "menu1", Name = "菜单1" }; var menu2 = new SysModule { Id = "menu2", Name = "菜单2" }; g.sqlite.Insert(new[] { menu1, menu2 }).ExecuteAffrows(); var button1 = new SysModuleButton { Id = "button1", Name = "添加" }; var button2 = new SysModuleButton { Id = "button2", Name = "修改" }; var button3 = new SysModuleButton { Id = "button3", Name = "删除" }; var button4 = new SysModuleButton { Id = "button4", Name = "查询" }; g.sqlite.Insert(new[] { button1, button2, button3, button4 }).ExecuteAffrows(); g.sqlite.Insert(new[] { new SysModulePermission { Id = "menu1_button1", SysModuleId = menu1.Id, SysModuleButtonId = button1.Id }, new SysModulePermission { Id = "menu1_button2", SysModuleId = menu1.Id, SysModuleButtonId = button2.Id }, new SysModulePermission { Id = "menu1_button3", SysModuleId = menu1.Id, SysModuleButtonId = button3.Id }, new SysModulePermission { Id = "menu1_button4", SysModuleId = menu1.Id, SysModuleButtonId = button4.Id }, new SysModulePermission { Id = "menu2_button1", SysModuleId = menu2.Id, SysModuleButtonId = button1.Id }, new SysModulePermission { Id = "menu2_button2", SysModuleId = menu2.Id, SysModuleButtonId = button2.Id }, new SysModulePermission { Id = "menu2_button3", SysModuleId = menu2.Id, SysModuleButtonId = button3.Id }, new SysModulePermission { Id = "menu2_button4", SysModuleId = menu2.Id, SysModuleButtonId = button4.Id }, }).ExecuteAffrows(); var list123123 = g.sqlite.Select() .IncludeMany(m => m.Permissions.Where(p => p.SysModuleId == m.Id), then => then.LeftJoin(p => p.Button.Id == p.SysModuleButtonId)) .ToList(); var sql = g.sqlite.Select() .ToSql(a => a.CreateTime.FormatDateTime("yyyy-MM-dd")); var parm1 = "11"; var parm2 = "22"; var parm3 = "33"; var testparmSelect = g.sqlserver.Select() .Where(a => a.nvarchar == "11" && a.nvarchar_notnull == "22" && a.nvarchar_null == "33" && a.varchar == "11" && a.varchar_notnull == "22" && a.varchar_null == "33" && a.nvarchar == parm1 && a.nvarchar_notnull == parm2 && a.nvarchar_null == parm3 && a.varchar == parm3 && a.varchar_notnull == parm2 && a.varchar_null == parm3 && a.nvarchar == parm1.SetDbParameter(10) && a.nvarchar_notnull == parm2.SetDbParameter(11) && a.nvarchar_null == parm3.SetDbParameter(12) && a.varchar == parm3.SetDbParameter(13) && a.varchar_notnull == parm2.SetDbParameter(14) && a.varchar_null == parm3.SetDbParameter(15) && "11" == a.nvarchar && "22" == a.nvarchar_notnull && "33" == a.nvarchar_null && "11" == a.varchar && "22" == a.varchar_notnull && "33" == a.varchar_null && parm1 == a.nvarchar && parm2 == a.nvarchar_notnull && parm3 == a.nvarchar_null && parm1 == a.varchar && parm2 == a.varchar_notnull && parm3 == a.varchar_null && parm1.SetDbParameter(10) == a.nvarchar && parm2.SetDbParameter(11) == a.nvarchar_notnull && parm3.SetDbParameter(12) == a.nvarchar_null && parm1.SetDbParameter(13) == a.varchar && parm2.SetDbParameter(14) == a.varchar_notnull && parm3.SetDbParameter(15) == a.varchar_null ); //g.sqlserver.CodeFirst.IsGenerateCommandParameterWithLambda = true; var name = "testname"; var sdfsdgselect1 = g.sqlserver.Select().Where(a => a.varchar == name); var sdfsdgselect2 = g.sqlserver.Select().Where(a => a.varchar == name.SetDbParameter(10)); g.sqlserver.Select().Where(a => a.varchar == name).ToList(); g.sqlserver.Select().Where(a => a.varchar == name.SetDbParameter(10)).ToList(); var testarr = new string[] { "1", "2" }; var sdfsdgselect3 = g.sqlserver.Select().Where(a => testarr.Contains(a.varchar)); g.sqlserver.Select().Where(a => testarr.Contains(a.varchar)).ToList(); } } [ExpressionCall] public static class DbFunc { static ThreadLocal context = new ThreadLocal(); public static string FormatDateTime(this DateTime that, string arg1) { return $"date_format({context.Value.ParsedContent["that"]}, {context.Value.ParsedContent["arg1"]})"; } /// /// 设置表达式中的 string 参数化长度,优化执行计划 /// /// /// /// public static string SetDbParameter(this string that, int size) { if (context.Value.DbParameter != null) { //已经参数化了,开启了全局表达式参数化功能:UseGenerateCommandParameterWithLambda(true) context.Value.DbParameter.Size = size; return context.Value.ParsedContent["that"]; } var guid = Guid.NewGuid().ToString("N").ToLower(); context.Value.UserParameters.Add(new SqlParameter { ParameterName = guid, SqlDbType = System.Data.SqlDbType.VarChar, Size = size, Value = that }); return $"@{guid}"; } } }