diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/1_Query.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/1_Query.cs index 230bc5649..645122b11 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/1_Query.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/1_Query.cs @@ -26,6 +26,80 @@ namespace OrmTest.Demo StoredProcedure(); Enum(); Simple(); + Async(); + Subqueryable(); + SqlQueryable(); + } + + private static void SqlQueryable() + { + var db = GetInstance(); + var list = db.SqlQueryable("select * from student").ToPageList(1, 2); + } + + private static void Subqueryable() + { + var db = GetInstance(); + var getAll11 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Max(s=>s.Id)==1).ToList(); + + var getAll7 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Any()).ToList(); + + var getAll9 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Count()==1).ToList(); + + var getAll10 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).OrderBy(s=>s.Id).Select(s=>s.Id) == 1).ToList(); + var getAll14 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).OrderByDesc(s => s.Id).Select(s => s.Id) == 1).ToList(); + + var getAll8= db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Where(s=>s.Name==it.Name).NotAny()).ToList(); + + var getAll1 = db.Queryable().Where(it => it.Id == SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id)).ToList(); + + var getAll2 = db.Queryable((st, sc) => new object[] { + JoinType.Left,st.Id==sc.Id + }) + .Where(st => st.Id == SqlFunc.Subqueryable().Where(s => s.Id == st.Id).Select(s => s.Id)) + .ToList(); + + var getAll3 = db.Queryable((st, sc) => new object[] { + JoinType.Left,st.Id==sc.Id + }) + .Select(st => + new + { + name = st.Name, + id = SqlFunc.Subqueryable().Where(s => s.Id == st.Id).Select(s => s.Id) + }) + .ToList(); + + var getAll4 = db.Queryable().Select(it => + new + { + name = it.Name, + id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) + }).ToList(); + + var getAll5 = db.Queryable().Select(it => + new Student + { + Name = it.Name, + Id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) + }).ToList(); + + } + + private static void Async() + { + var db = GetInstance(); + var list = db.Queryable().Where(it => it.Id == 1).SingleAsync(); + list.Wait(); + + var list2 = db.Queryable().SingleAsync(it => it.Id == 1); + list2.Wait(); + + var list3 = db.Queryable().Where(it => it.Id == 1).ToListAsync(); + list3.Wait(); + + var list4 = db.Queryable().Where(it => it.Id == 1).ToPageListAsync(1, 2); + list4.Wait(); } private static void Simple() @@ -40,10 +114,10 @@ namespace OrmTest.Demo sdb.DeleteById(1); sdb.Insert(new Student() { Name = "xx" }); sdb.Update(it => new Student { Name = "newvalue" }, it => it.Id == 1);//only update name where id=1 - sdb.Update(new Student() { Name="newavalue" ,Id=1});//update all where id=1 + sdb.Update(new Student() { Name = "newavalue", Id = 1 });//update all where id=1 //SimpleClient Get SqlSugarClient - var student3=sdb.FullClient.Queryable().InSingle(1); + var student3 = sdb.FullClient.Queryable().InSingle(1); } @@ -75,15 +149,25 @@ namespace OrmTest.Demo outPutValue = p2.Value; return dbResult; }); + + + //3 + var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", new { p1 = 1, p2 = 2 }); + + + var p11 = new SugarParameter("@p1", "1"); + var p22 = new SugarParameter("@p2", null, true);//isOutput=true + //4 + var dt2 = db.Ado.UseStoredProcedure().SqlQuery("sp_school", p11, p22); } private static void Tran() { var db = GetInstance(); - var x=db.Insertable(new Student() { CreateTime = DateTime.Now, Name = "tran" }).ExecuteCommand(); + var x = db.Insertable(new Student() { CreateTime = DateTime.Now, Name = "tran" }).ExecuteCommand(); //1. no result var result = db.Ado.UseTran(() => { - + var beginCount = db.Queryable().ToList(); db.Ado.ExecuteCommand("delete student"); var endCount = db.Queryable().Count(); @@ -128,11 +212,13 @@ namespace OrmTest.Demo // group id,name take first var list3 = db.Queryable() .PartitionBy(it => new { it.Id, it.Name }).Take(1).ToList(); + var list31 = db.Queryable() + .PartitionBy(it => new { it.Id, it.Name }).Take(1).Count(); int count = 0; var list4 = db.Queryable((st, sc) => st.SchoolId == sc.Id) - .PartitionBy(st => new { st.Name }).Take(1).OrderBy(st => st.Id,OrderByType.Desc).Select(st => st).ToPageList(1, 1000, ref count); + .PartitionBy(st => new { st.Name }).Take(2).OrderBy(st => st.Id, OrderByType.Desc).Select(st => st).ToPageList(1, 1000, ref count); //SqlFunc.AggregateSum(object thisValue) //SqlFunc.AggregateAvg(TResult thisValue) @@ -148,6 +234,7 @@ namespace OrmTest.Demo var t2 = db.Ado.GetInt("select 1"); var t3 = db.Ado.GetDataTable("select 1 as id"); db.Ado.CommitTran(); + var t11 = db.Ado.SqlQuery("select * from student"); //more //db.Ado.GetXXX... } @@ -160,14 +247,16 @@ namespace OrmTest.Demo var getNew = db.Queryable().Where(it => it.Id == 1).Select(it => new { id = SqlFunc.IIF(it.Id == 0, 1, it.Id), it.Name, it.SchoolId }).ToList(); var getAllNoLock = db.Queryable().With(SqlWith.NoLock).ToList(); var getByPrimaryKey = db.Queryable().InSingle(2); - var getSingleOrDefault = db.Queryable().Where(it=>it.Id==1).Single(); + var getSingleOrDefault = db.Queryable().Where(it => it.Id == 1).Single(); var getFirstOrDefault = db.Queryable().First(); var getByWhere = db.Queryable().Where(it => it.Id == 1 || it.Name == "a").ToList(); var getByFuns = db.Queryable().Where(it => SqlFunc.IsNullOrEmpty(it.Name)).ToList(); var sum = db.Queryable().Select(it => it.SchoolId).ToList(); - var sum2 = db.Queryable((st,sc)=>st.SchoolId==sc.Id).Sum((st,sc) => sc.Id); + var sum2 = db.Queryable((st, sc) => st.SchoolId == sc.Id).Sum((st, sc) => sc.Id); var isAny = db.Queryable().Where(it => it.Id == -1).Any(); var isAny2 = db.Queryable().Any(it => it.Id == -1); + var count = db.Queryable().Count(it => it.Id > 0); + var date = db.Queryable().Where(it => it.CreateTime.Value.Date == DateTime.Now.Date).ToList(); var getListByRename = db.Queryable().AS("Student").ToList(); var in1 = db.Queryable().In(it => it.Id, new int[] { 1, 2, 3 }).ToList(); var in2 = db.Queryable().In(new int[] { 1, 2, 3 }).ToList(); @@ -183,11 +272,28 @@ namespace OrmTest.Demo var joinSql = db.Queryable("student", "s").OrderBy("id").Select("id,name").ToPageList(1, 2); - var getDay1List = db.Queryable().Where(it=>it.CreateTime.Value.Hour==1).ToList(); - var getDateAdd = db.Queryable().Where(it => it.CreateTime.Value.AddDays(1)==DateTime.Now).ToList(); - var getDateIsSame= db.Queryable().Where(it => SqlFunc.DateIsSame(DateTime.Now,DateTime.Now,DateType.Hour)).ToList(); + var getDay1List = db.Queryable().Where(it => it.CreateTime.Value.Hour == 1).ToList(); + var getDateAdd = db.Queryable().Where(it => it.CreateTime.Value.AddDays(1) == DateTime.Now).ToList(); + var getDateIsSame = db.Queryable().Where(it => SqlFunc.DateIsSame(DateTime.Now, DateTime.Now, DateType.Hour)).ToList(); var getSqlList = db.Queryable().AS("(select * from student) t").ToList(); + + + var getUnionAllList = db.UnionAll(db.Queryable().Where(it => it.Id == 1), db.Queryable().Where(it => it.Id == 2)).ToList(); + + var getUnionAllList2 = db.UnionAll(db.Queryable(), db.Queryable()).ToList(); + + var test1 = db.Queryable((st, sc) => st.SchoolId == sc.Id).Where(st=>st.CreateTime>SqlFunc.GetDate()).Select((st, sc) => SqlFunc.ToInt64(sc.Id)).ToList(); + var test2 = db.Queryable((st, sc) => st.SchoolId == sc.Id) + .Where(st => + SqlFunc.IF(st.Id > 1) + .Return(st.Id) + .ElseIF(st.Id == 1) + .Return(st.SchoolId).End(st.Id) == 1).Select(st=>st).ToList(); + var test3 = db.Queryable().Select(it => it.Bool1).ToSql(); + var test4 = db.Queryable().Select(it => new { b=it.Bool1 }).ToSql(); + DateTime? result = DateTime.Now; + var test5 = db.Queryable().Where(it=>it.CreateTime> result.Value.Date).ToList(); } public static void Page() { @@ -245,8 +351,19 @@ namespace OrmTest.Demo var list4 = db.Queryable((st, sc) => new object[] { JoinType.Left,st.SchoolId==sc.Id }) - .Select((st, sc) => new { id=st.Id,school=sc }).ToList(); + .Select((st, sc) => new { id = st.Id, school = sc }).ToList(); + + var list5 = db.Queryable((st, sc) => new object[] { + JoinType.Left,st.SchoolId==sc.Id + }).AS("STUDENT").AS("SCHOOL") +.Select((st, sc) => new { id = st.Id, school = sc }).ToList(); + + + var list6 = db.Queryable((st, sc) => new object[] { + JoinType.Left,st.SchoolId==sc.Id + }).With(SqlWith.NoLock).AS("STUDENT").AS("SCHOOL") +.Select((st, sc) => new { id = st.Id, school = sc }).ToList(); } public static void Join() { @@ -262,7 +379,7 @@ namespace OrmTest.Demo JoinType.Left,st.SchoolId==sc.Id, JoinType.Left,st.SchoolId==st2.Id }) - .Where((st, sc, st2) => st2.Id == 1 || sc.Id == 1 || st.Id == 1).ToList(); + .Where((st, sc, st2) => st2.Id == 1 || sc.Id == 1 || st.Id == 1).With(SqlWith.NoLock).ToList(); //join return List var list3 = db.Queryable((st, sc) => new object[] { @@ -285,25 +402,49 @@ namespace OrmTest.Demo //The simple use of Join 2 table - var list5 = db.Queryable((st, sc) => st.SchoolId == sc.Id).Select((st,sc)=>new {st.Name,st.Id,schoolName=sc.Name}).ToList(); + var list5 = db.Queryable((st, sc) => st.SchoolId == sc.Id).Select((st, sc) => new { st.Name, st.Id, schoolName = sc.Name }).ToList(); //join 3 table - var list6 = db.Queryable((st, sc,sc2) => st.SchoolId == sc.Id&&sc.Id==sc2.Id) - .Select((st, sc,sc2) => new { st.Name, st.Id, schoolName = sc.Name,schoolName2=sc2.Name }).ToList(); + var list6 = db.Queryable((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id) + .Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToList(); //join 3 table page - var list7= db.Queryable((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id) - .Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1,2); + var list7 = db.Queryable((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id) + .Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1, 2); //join 3 table page var list8 = db.Queryable((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id) - .OrderBy(st=>st.Id) + .OrderBy(st => st.Id) .Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1, 2); + + //In + var list9 = db.Queryable("it") + .OrderBy(it => it.Id) + .In(it => it.Id, db.Queryable().Where("it.id=schoolId").Select(it => it.Id)) + .ToList(); + //SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] it WHERE [ID] + //IN (SELECT [Id] FROM [School] WHERE it.id=schoolId ) ORDER BY [ID] ASC + + var list10 = db.Queryable((st, sc) => st.SchoolId == sc.Id) + .In(st => st.Name, db.Queryable("sc2").Where("id=st.schoolid").Select(it => it.Name)) + .OrderBy(st => st.Id) + .Select(st => st) + .ToList(); + //SELECT st.* FROM [STudent] st ,[School] sc WHERE ( [st].[SchoolId] = [sc].[Id] ) AND [st].[Name] + //IN (SELECT [Name] FROM [School] sc2 WHERE id=st.schoolid ) ORDER BY [st].[ID] ASC + + var list11 = db.Queryable((st, sc) => st.SchoolId == sc.Id) + .In(st => st.Name, db.Queryable("sc2").Where(it => it.Id == 1).Where("id=st.schoolid").Select(it => it.Name)) + .OrderBy(st => st.Id) + .Select(st => st) + .ToList(); } public static void Funs() { var db = GetInstance(); var t1 = db.Queryable().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList(); + var t2 = db.Queryable().Where(it => SqlFunc.IsNull(it.Name,"nullvalue")=="nullvalue").ToList(); + var t3 = db.Queryable().Where(it => SqlFunc.MergeString("a",it.Name) == "nullvalue").ToList(); //SELECT [Id],[SchoolId],[Name],[CreateTime] FROM [Student] WHERE ((LOWER([Name])) = (LOWER(@MethodConst0)) ) /***More Functions***/ @@ -343,10 +484,11 @@ namespace OrmTest.Demo { var db = GetInstance(); db.IgnoreColumns.Add("TestId", "Student"); - var s1 = db.Queryable().Select(it => new ViewModelStudent2 { Name = it.Name, Student = it }).ToList(); + var s1 = db.Queryable().Where(it => it.Id == 136915).Single(); var s2 = db.Queryable().Select(it => new { id = it.Id, w = new { x = it } }).ToList(); var s3 = db.Queryable().Select(it => new { newid = it.Id }).ToList(); var s4 = db.Queryable().Select(it => new { newid = it.Id, obj = it }).ToList(); + var s41 = db.Queryable().Select("*").ToList(); var s5 = db.Queryable().Select(it => new ViewModelStudent2 { Student = it, Name = it.Name }).ToList(); var s6 = db.Queryable((st, sc) => new object[] { JoinType.Left,st.SchoolId==sc.Id @@ -366,6 +508,9 @@ namespace OrmTest.Demo .OrderBy((st, sc) => st.SchoolId) .Select((st, sc) => sc) .Take(1).ToList(); + + var s9 = db.Queryable().Select(it=>new Student() { Id=it.Id, TestId=1, Name=it.Name, CreateTime=it.CreateTime }).First(); + var s10 = db.Queryable().Select(it => new Student() { Id = it.Id}).First(); } private static void Sqlable() { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/2_Update.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/2_Update.cs index 2f9a678a2..13a5bc9d5 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/2_Update.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/2_Update.cs @@ -24,7 +24,7 @@ namespace OrmTest.Demo //Only update Name var t3 = db.Updateable(updateObj).UpdateColumns(it => new { it.Name }).ExecuteCommand(); - var t3_1 = db.Updateable(updateObj).UpdateColumns(it => it=="Name").ExecuteCommand(); + var t3_1 = db.Updateable(updateObj).UpdateColumns(it => it == "Name").ExecuteCommand(); //Ignore Name and TestId @@ -58,6 +58,16 @@ namespace OrmTest.Demo //Column is null no update db.Updateable(updateObj).Where(true).ExecuteCommand(); + + + var t12 = db.Updateable().AS("Student").UpdateColumns(it => new School() { Name = "jack" }).Where(it => it.Id == 1).ExecuteCommandAsync(); + t12.Wait(); + + //update one columns + var count = db.Updateable().UpdateColumns(it => it.SchoolId == 1).Where(it => it.Id == 1).ExecuteCommand(); + + + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/3_Insert.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/3_Insert.cs index f3d162dae..4e2de445d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/3_Insert.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/3_Insert.cs @@ -55,6 +55,10 @@ namespace OrmTest.Demo var t10 = db.Insertable(insertObjs.ToArray()).InsertColumns(it => new { it.Name }).ExecuteCommand(); var t11 = db.Insertable(insertObjs.ToArray()).ExecuteCommand(); + + + var t12 = db.Insertable(insertObj).IgnoreColumns(it => it == "Name" || it == "TestId").ExecuteReturnIdentityAsync(); + t12.Wait(); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/4_Delete.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/4_Delete.cs index 1276ea3ee..3258548d1 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/4_Delete.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/4_Delete.cs @@ -28,6 +28,9 @@ namespace OrmTest.Demo //by expression id>1 and id==1 var t5 = db.Deleteable().Where(it => it.Id > 1).Where(it => it.Id == 1).ExecuteCommand(); + + var t6 = db.Deleteable().AS("student").Where(it => it.Id > 1).Where(it => it.Id == 1).ExecuteCommandAsync(); + t6.Wait(); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/5_CodeFirst.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/5_CodeFirst.cs index 165dfd999..965991457 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/5_CodeFirst.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/5_CodeFirst.cs @@ -22,8 +22,10 @@ namespace OrmTest.Demo public DateTime? DateTime { get; set; } [SugarColumn(IsNullable = true,OldColumnName = "Dob")] public double? Dob2 { get; set; } - [SugarColumn(Length =110)] + [SugarColumn(Length =11000)] public string A1 { get; set; } + [SugarColumn(Length = 18,DecimalDigits=2)] + public decimal Dec { get; set; } } public class CodeTable2 { public int Id { get; set; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/8_JoinSql.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/8_JoinSql.cs index 78adb85b8..e0f054608 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/8_JoinSql.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/8_JoinSql.cs @@ -1,5 +1,6 @@ using OrmTest.Demo; using OrmTest.Models; +using SqlSugar; using System; using System.Collections.Generic; using System.Linq; @@ -16,8 +17,47 @@ namespace OrmTest.Demo { Where(); OrderBy(); + SelectMerge(); + ConditionalModel(); + JoinExp(); } + private static void JoinExp() + { + var db = GetInstance(); + + var exp= Expressionable.Create() + .OrIF(1==1,it => it.Id == 11) + .And(it=>it.Id==1) + .AndIF(2==2,it => it.Id == 1) + .Or(it =>it.Name == "a1").ToExpression(); + var list=db.Queryable().Where(exp).ToList(); + } + + private static void ConditionalModel() + { + var db = GetInstance(); + List conModels = new List(); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1" }); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.IsNullOrEmpty }); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.In,FieldValue="1,2,3" }); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.NotIn, FieldValue = "1,2,3" }); + conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.NoEqual, FieldValue = "1,2,3" }); + var student = db.Queryable().Where(conModels).ToList(); + } + + private static void SelectMerge() + { + var db = GetInstance(); + //page join + var pageJoin = db.Queryable((st, sc) => new object[] { + JoinType.Left,st.SchoolId==sc.Id + }) + .Select((st, sc) => new { id = st.Id, name = sc.Name }) + .MergeTable().Where(XXX => XXX.id == 1).OrderBy("name asc").ToList();// Prefix, is, not, necessary, and take the columns in select + + } private static void Where() { var db = GetInstance(); @@ -32,14 +72,14 @@ namespace OrmTest.Demo var db = GetInstance(); //propertyName is valid string propertyName = "Id"; - string dbColumnName = db.EntityProvider.GetDbColumnName(propertyName); + string dbColumnName = db.EntityMaintenance.GetDbColumnName(propertyName); var list = db.Queryable().OrderBy(dbColumnName).ToList(); //propertyName is invalid try { propertyName = "Id'"; - dbColumnName = db.EntityProvider.GetDbColumnName(propertyName); + dbColumnName = db.EntityMaintenance.GetDbColumnName(propertyName); var list2 = db.Queryable().OrderBy(dbColumnName).ToList(); } catch (Exception ex) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/9_Aop.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/9_Aop.cs new file mode 100644 index 000000000..7a1dbc3db --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/9_Aop.cs @@ -0,0 +1,46 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OrmTest.Demo +{ + public class Aop + { + + public static void Init() + { + SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true }); + db.Aop.OnLogExecuted = (sql, pars) => + { + + }; + db.Aop.OnLogExecuting = (sql, pars) => + { + + }; + db.Aop.OnError = (exp) => + { + + }; + db.Aop.OnExecutingChangeSql = (sql, pars) => + { + return new KeyValuePair(sql,pars); + }; + + db.Queryable().ToList(); + + try + { + db.Queryable().AS(" ' ").ToList(); + } + catch (Exception) + { + + + } + } + +} +} \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/D_QueryableView.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/D_QueryableView.cs new file mode 100644 index 000000000..4facf86ca --- /dev/null +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/D_QueryableView.cs @@ -0,0 +1,33 @@ +using OrmTest.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace OrmTest.Demo +{ + public class D_QueryableViewn : DemoBase + { + public static void Init() + { + var db = GetInstance(); + var q1 = db.Queryable((st,sc)=>new object[] { + JoinType.Left,st.SchoolId==sc.Id + }).Select((st, sc) => new ViewModelStudent4() { Id=st.Id, Name=st.Name,SchoolName=sc.Name }); + + var q2 = db.Queryable(); + + + var innerJoinList = db.Queryable(q1, q2, (j1, j2) => j1.Id == j2.Id).Select((j1, j2) => j1).ToList();//inner join + + var leftJoinList = db.Queryable(q1, q2,JoinType.Left, (j1, j2) => j1.Id == j2.Id).Select((j1, j2) => j1).ToList();//left join + } + } + + public class ViewModelStudent4 { + public int Id { get; set; } + public string SchoolName { get; set; } + public string Name { get; set; } + } +} diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/DemoBase.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/DemoBase.cs index db605776a..46e139686 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/DemoBase.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Demos/DemoBase.cs @@ -14,7 +14,7 @@ namespace OrmTest.Demo db.Ado.IsEnableLogEvent = true; db.Ado.LogEventStarting = (sql, pars) => { - Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(s => s.ParameterName, s => s.Value))); + Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; return db; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs index bf77f7c1e..5061a4745 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/Program.cs @@ -1,9 +1,17 @@ -using OrmTest; -using OrmTest.PerformanceTesting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Linq.Expressions; +using SqlSugar; +using OrmTest.Models; +using System.Data.SqlClient; using OrmTest.UnitTest; -using System; +using OrmTest.PerformanceTesting; -namespace SqlSeverTest +namespace OrmTest { class Program { @@ -37,9 +45,11 @@ namespace SqlSeverTest OrmTest.Demo.Filter.Init(); OrmTest.Demo.ComplexModel.Init(); OrmTest.Demo.CodeFirst.Init(); + OrmTest.Demo.Aop.Init(); OrmTest.Demo.MasterSlave.Init(); OrmTest.Demo.SharedConnection.Init(); OrmTest.Demo.ExtSqlFun.Init(); + OrmTest.Demo.D_QueryableViewn.Init(); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Delete.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Delete.cs index 0243b5596..28c408944 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Delete.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Delete.cs @@ -56,6 +56,20 @@ namespace OrmTest base.Check(@"DELETE FROM [STudent] WHERE id=@id", new List() { new SugarParameter("@id",1) }, t6.Key, t6.Value, "Delte t6 error"); + + var t7 = base.GetInstanceByAttribute().Deleteable().Where(new List() { + new DeleteTestTable() { Id=1, Id2="x" }, + new DeleteTestTable() { Id=2, Id2="x1" } + }).ToSql(); + base.Check("DELETE FROM [DeleteTestTable] WHERE (([Id]=N'1'AND [Id2]=N'x')OR ([Id]=N'2'AND [Id2]=N'x1')) ",null, t7.Key, null, + "Delte t7 error"); } } + + public class DeleteTestTable { + [SugarColumn(IsPrimaryKey =true)] + public int Id { get; set; } + [SugarColumn(IsPrimaryKey = true)] + public string Id2 { get; set; } + } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/EnumTest.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/EnumTest.cs index 8da966c05..768a10b5a 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/EnumTest.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/EnumTest.cs @@ -20,7 +20,7 @@ namespace OrmTest.UnitTest var db = GetInstance(); var shoolValue = SchoolEnum.HarvardUniversity; var enums = new SchoolEnum[] { shoolValue, SchoolEnum.UniversityOfOxford }; - var list = db.Queryable().AS("student").Where(it => it.SchoolId == shoolValue).ToList(); + var list = db.Queryable().AS("student").Where(it => it.SchoolId == shoolValue).Select(it=>it.SchoolId).ToList(); var x = new StudentEnum() { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Method.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Method.cs index 813c44807..f670ec85e 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Method.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Method.cs @@ -74,10 +74,25 @@ namespace OrmTest.UnitTest Replace(); Length(); Time(); + + Test1(); } base.End("Method Test"); } + private void Test1() + { + var ids = new int[] { 1, 2, 3 }; + Expression> exp = it => ids.Contains(it.Id)&&!SqlFunc.IsNullOrEmpty(it.Name); + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "(([Id] IN ('1','2','3')) AND NOT( [Name]='' OR [Name] IS NULL ))", new List() { + + }, "Test1 error"); + } + private void ExtendToString() { Expression> exp = it => it.Id.ToString() == "a"; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Select.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Select.cs index f99a76133..9a5ff983f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Select.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Select.cs @@ -26,6 +26,9 @@ namespace OrmTest.UnitTest single3(); single4(); single5(); + single6(); + single7(); + single8(); Multiple(); Multiple2(); singleDynamic(); @@ -34,6 +37,44 @@ namespace OrmTest.UnitTest base.End("Select Test"); } + private void single7() + { + Expression> exp =it => new DataTestInfo2() { Bool1=it.Bool1 , Bool2=it.Bool2 }; + ExpressionContext expContext = new ExpressionContext(); + expContext.IsSingle = false; + expContext.Resolve(exp, ResolveExpressType.SelectSingle); + var selectorValue = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check( + selectorValue, + pars, + @"[Bool1] AS [Bool1] , [Bool2] AS [Bool2] ", + new List() + { + + }, + "Select.single7 Error"); + } + + private void single8() + { + Expression> exp = it => new { Bool1 = it.Bool1, Bool2 = it.Bool2 }; + ExpressionContext expContext = new ExpressionContext(); + expContext.IsSingle = false; + expContext.Resolve(exp, ResolveExpressType.SelectSingle); + var selectorValue = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check( + selectorValue, + pars, + @"[Bool1] AS [Bool1] , [Bool2] AS [Bool2] ", + new List() + { + + }, + "Select.single8 Error"); + } + private void Multiple() { Expression> exp = (it, school) => new Student() { Name = "a", Id = it.Id, SchoolId = school.Id, TestId = it.Id + 1 }; @@ -161,7 +202,22 @@ namespace OrmTest.UnitTest @"( @constant0<>'' AND @constant0 IS NOT NULL )", new List() { new SugarParameter("@constant0",p) }, selectorValue, pars, - "Select.single4 Error"); + "Select.single5 Error"); + } + private void single6() + { + var p = (DateTime?)DateTime.Now; + Expression> exp = it => p.Value; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.IsSingle = false; + expContext.Resolve(exp, ResolveExpressType.FieldSingle); + var selectorValue = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check( + @" @Const0 ", new List() { + new SugarParameter("@Const0",p) + }, selectorValue, pars, + "Select.single6 Error"); } private void singleDynamic() diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Where.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Where.cs index f6476cb51..0942a94f4 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Where.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/ExpressionTest/Where.cs @@ -21,7 +21,12 @@ namespace OrmTest.UnitTest base.Begin(); for (int i = 0; i < base.Count; i++) { - + whereSingle29("22"); + whereSingle28(); + whereSingle27(); + whereSingle26(); + whereSingle25(); + whereSingle24(); whereSingle23(); whereSingle22(); whereSingle21(); @@ -52,6 +57,45 @@ namespace OrmTest.UnitTest } base.End("Where Test"); } + public string Get28(string a) { + return a + "1"; + } + + private void whereSingle29(string p2) + { + Expression> exp = it => Get28("22") == p2; + ExpressionContext expContext = new ExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereMultiple); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, " (@constant0 = @Const1 )", new List() { + new SugarParameter("@constant0","221"), + new SugarParameter("@Const1","22") + }, "whereSingle28"); + } + private void whereSingle28() + { + Expression> exp = it => Get28("22")=="22"; + ExpressionContext expContext = new ExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereMultiple); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, " (@constant0 = @Const1 )", new List() { + new SugarParameter("@constant0","221"), + new SugarParameter("@Const1","22") + }, "whereSingle28"); + } + private void whereSingle27() { + var schoolData = new School() { Id = 100, Name = "x" }; + Expression> exp = it => it.Name.Contains(schoolData.Name); + ExpressionContext expContext = new ExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereMultiple); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, " ([it].[Name] like '%'+@MethodConst0+'%') ", new List() { + new SugarParameter("@MethodConst0","x") + }, "whereSingle27"); + } private void WhereMultiple1() { Expression> exp = it => it.Id > 1; @@ -378,6 +422,46 @@ namespace OrmTest.UnitTest new SugarParameter("@Const0",val) }, "whereSingle23"); } + private void whereSingle24() + { + Expression> exp = it => it.Datetime1 > DateTime.Now.Date; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "( [Datetime1] > @Datetime10 )", new List() + { + new SugarParameter("@Datetime10",DateTime.Now.Date) + }, "whereSingle24"); + } + private void whereSingle26() + { + var p = DateTime.Now; + Expression> exp = it => it.Bool1&&it.Bool1; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "( ( [Bool1]=1 ) AND ( [Bool1]=1 ) )", new List() + { + + + }, "whereSingle26"); + } + private void whereSingle25() + { + var p = DateTime.Now; + Expression> exp = it => it.Datetime1.Date > p.Date; + SqlServerExpressionContext expContext = new SqlServerExpressionContext(); + expContext.Resolve(exp, ResolveExpressType.WhereSingle); + var value = expContext.Result.GetString(); + var pars = expContext.Parameters; + base.Check(value, pars, "( CAST( DateName(Year,[Datetime1]) +'-'+ DateName(Month,[Datetime1]) +'-'+ DateName(Day,[Datetime1]) AS DATETIME) > @Date0 )", new List() + { + new SugarParameter("@Date0",DateTime.Now.Date), + + }, "whereSingle25"); + } } public class WhereConst diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Insert.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Insert.cs index ecd4ccb8a..c8e2d4aa0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Insert.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Insert.cs @@ -37,7 +37,7 @@ namespace OrmTest.UnitTest //Insert reutrn Command Count - var t2 = db.Insertable(insertObj).ExecuteCommand(); + var t2 = db.Insertable(insertObj).ExecuteReturnEntity(); db.IgnoreColumns = null; //Only insert Name diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Mapping .cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Mapping .cs index f1ef5314c..b5be0d75c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Mapping .cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Mapping .cs @@ -60,7 +60,7 @@ namespace OrmTest.UnitTest db.Ado.IsEnableLogEvent = true; db.Ado.LogEventStarting = (sql, pars) => { - Console.WriteLine(sql + "\r\n" + db.RewritableMethods.SerializeObject(pars)); + Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars)); Console.WriteLine(); }; return db; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SelectQuery.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SelectQuery.cs index 73f44cfbb..fc2769d33 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SelectQuery.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SelectQuery.cs @@ -91,7 +91,21 @@ namespace OrmTest.UnitTest var t4 = db.Queryable((st, sc, sc2) => new object[] { JoinType.Left,st.SchoolId==sc.Id, JoinType.Left,sc2.Id==sc.Id - }).GroupBy(st => st.Id).Select(st=>st.Id).Count(); + }).GroupBy(st => st.Id).Select(st => st.Id).Count(); + + DateTime? result = DateTime.Now; + var t5 = db.Queryable().Where(it => it.CreateTime > result.Value.Date).ToSql(); + base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] WHERE ( [CreateTime] > @Const0 )", + new List() { + new SugarParameter("@Const0",result.Value.Date) + }, t5.Key, t5.Value, "select t5 Error"); + db.Ado.IsEnableLogEvent = false; + + var t6 = db.Queryable().Where(it => SqlFunc.HasValue(it.Bool2) == false).ToSql(); + base.Check("SELECT [PK],[Bool1],[Bool2],[Text1] FROM [DataTestInfo2] WHERE (( CASE WHEN ( [Bool2]<>'' AND [Bool2] IS NOT NULL ) THEN 1 ELSE 0 END ) = @Const0 )", + new List() { + new SugarParameter("@Const0",false) + }, t6.Key, t6.Value, "select t6 Error"); #endregion diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SingleQuery.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SingleQuery.cs index 4bf37e5d4..c06102a0c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SingleQuery.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Query/SingleQuery.cs @@ -116,6 +116,22 @@ namespace OrmTest.UnitTest var t12 = db.Queryable().Where(it=>it.Id!=null).ToSql(); base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] WHERE ( [ID] IS NOT NULL )", null, t12.Key, t12.Value, "single t12 error"); + + var id = 1; + var t13 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id&&s.Id==id).Max(s => s.Id) == 1).ToSql(); + base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] it WHERE ((SELECT MAX([Id]) FROM [School] WHERE (( [Id] = [it].[ID] ) AND ( [Id] = @Id0 ))) = @Const1 )", + new List() { + new SugarParameter("@Id0",1), + new SugarParameter("@Const1",1) + }, t13.Key, t13.Value, "single t13 error "); + + + var t14 = db.Queryable() + .Where(it => it.Name == "a" && SqlFunc.HasValue(it.Name)).ToSql(); + base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] WHERE (( [Name] = @Name0 ) AND ( [Name]<>'' AND [Name] IS NOT NULL ))", + new List() { + new SugarParameter("@Name0","a") + }, t14.Key, t14.Value, "single t14 error "); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/UnitTestBase.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/UnitTestBase.cs index 1aeea8b30..899eadaea 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/UnitTestBase.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/UnitTestBase.cs @@ -51,5 +51,11 @@ namespace OrmTest.UnitTest SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true }); return db; } + + public SqlSugarClient GetInstanceByAttribute() + { + SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { InitKeyType=InitKeyType.Attribute, ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true }); + return db; + } } } \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Update.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Update.cs index 62a1fa491..ba18882e8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Update.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSeverTest/UnitTest/Update.cs @@ -151,14 +151,37 @@ namespace OrmTest.UnitTest [Name]=@Name WHERE [Id]=@Id", new List() { new SugarParameter("@Name","a"), new SugarParameter("@ID",1) - }, t13.Key, t13.Value, "Insert t13 error"); + }, t13.Key, t13.Value, "Update t13 error"); var t14 = db.Updateable(new Dictionary() { { "id", 0 }, { "name", "2" } }).ToSql(); base.Check(@"UPDATE [STudent] SET [Name]=@Name WHERE [Id]=@Id", new List() { new SugarParameter("@Name", "2"), new SugarParameter("@ID", 0) - }, t14.Key, t14.Value, "Insert t14 error"); + }, t14.Key, t14.Value, "Update t14 error"); + + + // var t15 = db.Updateable(new StudentTest() { Id = 1, Name = "1" }).AS("student").ToSql(); + // base.Check(@"UPDATE [student] SET + //[SchoolId]=@SchoolId,[Name]=@Name,[CreateTime]=@CreateTime WHERE [Id]=@Id", null, t15.Key, null, "Update t15 error"); + + + var t16= db.Updateable().UpdateColumns(it => new Student() + { + SchoolId = SqlFunc.Subqueryable().Where(s => s.Id == it.SchoolId).Select(s => s.Id), + Name = "newname" + }).Where(it => it.Id == 1).ToSql(); + + var t17 = db.Updateable().UpdateColumns(it => new Student() + { + SchoolId = SqlFunc.Subqueryable().Where(s => s.Id == it.SchoolId).Select(s => s.Id), + Name = "newname" + }).Where(it => it.Id == 1).ToSql(); + base.Check(@"UPDATE [STudent] SET + [SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) , [Name] = @Const0 WHERE ( [ID] = @Id1 )", new List() { + new SugarParameter("@Const0","newname"), + new SugarParameter("@Id1","1") + }, t17.Key, t17.Value, "Update t17 error"); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs index cfe661c45..b1978041b 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs @@ -472,7 +472,7 @@ namespace SqlSugar if (parameters != null && parameters.Any()) builder.SqlQueryBuilder.Parameters.AddRange(parameters); var dataReader = this.GetDataReader(builder.SqlQueryBuilder.ToSqlString(), builder.SqlQueryBuilder.Parameters.ToArray()); - List result = this.DbBind.DataReaderToList(typeof(T), dataReader, builder.SqlQueryBuilder.Fields); + List result = this.DbBind.DataReaderToList(typeof(T), dataReader); builder.SqlQueryBuilder.Clear(); if (this.Context.Ado.DataReaderParameters != null) { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs index d5a1a1462..06f8d3440 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs @@ -7,13 +7,14 @@ namespace SqlSugar { public partial class DbBindAccessory { - protected List GetEntityList(SqlSugarClient context, IDataReader dataReader, string fields) + protected List GetEntityList(SqlSugarClient context, IDataReader dataReader) { Type type = typeof(T); - string key = "DataReaderToList." + fields+ dataReader.FieldCount+ context.CurrentConnectionConfig.DbType + type.FullName; - IDataReaderEntityBuilder entytyList = context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(key, () => + var fieldNames = GetDataReaderNames(dataReader); + string cacheKey = GetCacheKey(type,fieldNames); + IDataReaderEntityBuilder entytyList = context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () => { - var cacheResult = new IDataReaderEntityBuilder(context, dataReader).CreateBuilder(type); + var cacheResult = new IDataReaderEntityBuilder(context, dataReader,fieldNames).CreateBuilder(type); return cacheResult; }); List result = new List(); @@ -32,6 +33,29 @@ namespace SqlSugar return result; } + private string GetCacheKey(Type type,List keys) + { + StringBuilder sb = new StringBuilder("DataReaderToList."); + sb.Append(type.FullName); + sb.Append("."); + foreach (var item in keys) + { + sb.Append(item); + } + return sb.ToString(); + } + + private List GetDataReaderNames(IDataReader dataReader) + { + List keys = new List(); + var count = dataReader.FieldCount; + for (int i = 0; i < count; i++) + { + keys.Add(dataReader.GetName(i)); + } + return keys; + } + protected List GetKeyValueList(Type type, IDataReader dataReader) { List reval = new List(); @@ -125,7 +149,7 @@ namespace SqlSugar } else if (type.IsEnum) { - reval.Add((T)Enum.Parse(type,value.ObjToString())); + reval.Add((T)Enum.Parse(type, value.ObjToString())); } else { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index d49547c53..67e17c8b2 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -175,7 +175,7 @@ namespace SqlSugar return propertyTypes.First().Value.ToString(); } } - public virtual List DataReaderToList(Type type, IDataReader dataReader, string fields) + public virtual List DataReaderToList(Type type, IDataReader dataReader) { using (dataReader) { @@ -193,7 +193,7 @@ namespace SqlSugar } else { - return GetEntityList(Context, dataReader, fields); + return GetEntityList(Context, dataReader); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 4c8ad3757..ec3e51be8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -74,12 +74,12 @@ namespace SqlSugar } - public IDataReaderEntityBuilder(SqlSugarClient context, IDataRecord dataRecord) + public IDataReaderEntityBuilder(SqlSugarClient context, IDataRecord dataRecord,List fieldNames) { this.Context = context; this.DataRecord = dataRecord; this.DynamicBuilder = new IDataReaderEntityBuilder(); - this.ReaderKeys = new List(); + this.ReaderKeys = fieldNames; } #endregion @@ -91,10 +91,6 @@ namespace SqlSugar public IDataReaderEntityBuilder CreateBuilder(Type type) { - for (int i = 0; i < this.DataRecord.FieldCount; i++) - { - this.ReaderKeys.Add(this.DataRecord.GetName(i)); - } DynamicMethod method = new DynamicMethod("SqlSugarEntity", type, new Type[] { typeof(IDataRecord) }, type, true); ILGenerator generator = method.GetILGenerator(); @@ -121,14 +117,13 @@ namespace SqlSugar } } } - if (Context.IgnoreColumns != null && Context.IgnoreColumns.Any(it => it.PropertyName.Equals(propertyInfo.Name, StringComparison.CurrentCultureIgnoreCase) - && it.EntityName.Equals(type.Name, StringComparison.CurrentCultureIgnoreCase))) + if (IsIgnore(type, propertyInfo)&&!this.ReaderKeys.Any(it=>it==fileName)) { continue; } if (propertyInfo != null && propertyInfo.GetSetMethod() != null) { - if (propertyInfo.PropertyType.IsClass() && propertyInfo.PropertyType != UtilConstants.ByteArrayType&&propertyInfo.PropertyType!=UtilConstants.ObjType) + if (propertyInfo.PropertyType.IsClass() && propertyInfo.PropertyType != UtilConstants.ByteArrayType && propertyInfo.PropertyType != UtilConstants.ObjType) { BindClass(generator, result, propertyInfo); } @@ -146,9 +141,15 @@ namespace SqlSugar DynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load)); return DynamicBuilder; } + #endregion #region Private methods + private bool IsIgnore(Type type, PropertyInfo propertyInfo) + { + return Context.IgnoreColumns != null && Context.IgnoreColumns.Any(it => it.PropertyName.Equals(propertyInfo.Name, StringComparison.CurrentCultureIgnoreCase) + && it.EntityName.Equals(type.Name, StringComparison.CurrentCultureIgnoreCase)); + } private void BindClass(ILGenerator generator, LocalBuilder result, PropertyInfo propertyInfo) { @@ -253,9 +254,9 @@ namespace SqlSugar case CSharpDataType.@float: case CSharpDataType.@double: CheckType(bind.DoubleThrow, bindProperyTypeName, validPropertyName, propertyName); - if (bindProperyTypeName == "double") + if (bindProperyTypeName.IsIn( "double", "single")&&dbTypeName!="real") method = isNullableType ? getConvertDouble : getDouble; - if (bindProperyTypeName == "single") + else method = isNullableType ? getConvertFloat : getFloat; break; case CSharpDataType.Guid: diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index bbd72d5a2..375348c71 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1085,7 +1085,7 @@ namespace SqlSugar } else { - result = this.Bind.DataReaderToList(entityType, dataReader, QueryBuilder.SelectCacheKey); + result = this.Bind.DataReaderToList(entityType, dataReader); } SetContextModel(result, entityType); return result; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs index d8526a8f1..8951d0b0d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs @@ -110,6 +110,7 @@ namespace SqlSugar public abstract string SqlTranslationRight { get; } public virtual string SqlFalse { get { return "1=2 "; } } public virtual string SqlDateNow { get { return "GETDATE()"; } } + public virtual string SqlSelectAll { get { return "*"; } } #endregion } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index 435ffb2e4..048cca63b 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SqlSugar { @@ -48,7 +49,7 @@ namespace SqlSugar } MemberAssignment memberAssignment = (MemberAssignment)binding; var type = memberAssignment.Member.ReflectedType; - var memberName =this.Context.GetDbColumnName(type.Name, memberAssignment.Member.Name); + var memberName = this.Context.GetDbColumnName(type.Name, memberAssignment.Member.Name); var item = memberAssignment.Expression; if ((item is MemberExpression) && ((MemberExpression)item).Expression == null) { @@ -56,21 +57,21 @@ namespace SqlSugar string parameterName = AppendParameter(paramterValue); this.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); } - else if (item is UnaryExpression || item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant) + else if (IsMethod(item)) + { + if (item is UnaryExpression) + item = (item as UnaryExpression).Operand; + MethodCall(parameter, memberName, item); + } + else if (IsConst(item)) { base.Expression = item; base.Start(); - string parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const+ this.Context.ParameterIndex; + string parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex; parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); this.Context.ParameterIndex++; } - else if (item is MethodCallExpression) - { - base.Expression = item; - base.Start(); - parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString())); - } else if (item is MemberExpression) { if (base.Context.Result.IsLockCurrentParameter == false) @@ -87,12 +88,46 @@ namespace SqlSugar } else if (item is BinaryExpression) { - var result=GetNewExpressionValue(item); + var result = GetNewExpressionValue(item); this.Context.Result.Append(base.Context.GetEqString(memberName, result)); } } } + private static bool IsConst(Expression item) + { + return item is UnaryExpression || item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant; + } + + private static bool IsMethod(Expression item) + { + return item is MethodCallExpression || (item is UnaryExpression && (item as UnaryExpression).Operand is MethodCallExpression); + } + + private void MethodCall(ExpressionParameter parameter, string memberName, Expression item) + { + if (IsSubMethod(item as MethodCallExpression)) + { + UtilMethods.GetOldValue(parameter.CommonTempData, () => + { + parameter.CommonTempData = CommonTempDataType.Result; + base.Expression = item; + base.Start(); + var subSql = base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString()); + if (ResolveExpressType.Update == this.Context.ResolveType) { + subSql = Regex.Replace(subSql,@" \[\w+?\]\.",this.Context.GetTranslationTableName(parameter.CurrentExpression.Type.Name,true) +"."); + } + parameter.Context.Result.Append(subSql); + }); + } + else + { + base.Expression = item; + base.Start(); + parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString())); + } + } + private void Select(MemberInitExpression expression, ExpressionParameter parameter, bool isSingle) { foreach (MemberBinding binding in expression.Bindings) @@ -107,5 +142,10 @@ namespace SqlSugar ResolveNewExpressions(parameter, item, memberName); } } + + private bool IsSubMethod(MethodCallExpression express) + { + return SubTools.SubItemsConst.Any(it =>express.Object != null && express.Object.Type.Name == "Subqueryable`1"); + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index fd30e7c6c..1fe6b24b7 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -45,7 +45,7 @@ namespace SqlSugar //Check.Exception(!(parameter.BaseExpression is BinaryExpression), "Current expressions are not supported"); SubResolve subResolve = new SubResolve(express, this.Context, parameter.OppsiteExpression); var appendSql = subResolve.GetSql(); - if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle)) + if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle)||(parameter.BaseParameter!=null&¶meter.BaseParameter.CommonTempData!=null&¶meter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result))) { parameter.BaseParameter.CommonTempData = appendSql; } @@ -105,32 +105,61 @@ namespace SqlSugar private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) { - CheckMethod(express); - var method = express.Method; - string name = method.Name; - var args = express.Arguments.Cast().ToList(); - MethodCallExpressionModel model = new MethodCallExpressionModel(); - model.Args = new List(); - switch (this.Context.ResolveType) + if (!CheckMethod(express)) { - case ResolveExpressType.WhereSingle: - case ResolveExpressType.WhereMultiple: - Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select."); - Where(parameter, isLeft, name, args, model); - break; - case ResolveExpressType.SelectSingle: - case ResolveExpressType.SelectMultiple: - case ResolveExpressType.Update: - Select(parameter, isLeft, name, args, model); - break; - case ResolveExpressType.FieldSingle: - case ResolveExpressType.FieldMultiple: - Field(parameter, isLeft, name, args, model); - break; - default: - break; + CusMethod(parameter, express, isLeft); + } + else + { + var method = express.Method; + string name = method.Name; + var args = express.Arguments.Cast().ToList(); + MethodCallExpressionModel model = new MethodCallExpressionModel(); + model.Args = new List(); + switch (this.Context.ResolveType) + { + case ResolveExpressType.WhereSingle: + case ResolveExpressType.WhereMultiple: + Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select."); + Where(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.SelectSingle: + case ResolveExpressType.SelectMultiple: + case ResolveExpressType.Update: + Select(parameter, isLeft, name, args, model); + break; + case ResolveExpressType.FieldSingle: + case ResolveExpressType.FieldMultiple: + Field(parameter, isLeft, name, args, model); + break; + default: + break; + } } } + + private void CusMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) + { + try + { + var constValue = ExpressionTool.DynamicInvoke(express); + parameter.BaseParameter.CommonTempData = constValue; + var parameterName = base.AppendParameter(constValue); + if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result)) + { + this.Context.Result.Append(parameterName); + } + else + { + base.AppendValue(parameter, isLeft, parameterName); + } + } + catch + { + Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name)); + } + } + private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft, string name, List appendArgs = null) { var method = express.Method; @@ -521,10 +550,14 @@ namespace SqlSugar { return SubTools.SubItemsConst.Any(it => it.Name == methodName) && express.Object != null && express.Object.Type.Name == "Subqueryable`1"; } - private void CheckMethod(MethodCallExpression expression) + private bool CheckMethod(MethodCallExpression expression) { - if (IsExtMethod(expression.Method.Name)) return; - Check.Exception(expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName, string.Format(ErrorMessage.MethodError, expression.Method.Name)); + if (IsExtMethod(expression.Method.Name)) + return true; + if (expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName) + return false; + else + return true; } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/SqlSugarAccessory.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/SqlSugarAccessory.cs index 49e6803fe..1eb788dbe 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/SqlSugarAccessory.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/SqlSugarAccessory.cs @@ -140,33 +140,33 @@ namespace SqlSugar } private void InitMppingInfo(EntityInfo entityInfo) { - if (this.MappingTables == null) - this.MappingTables = new MappingTableList(); - if (this.MappingColumns == null) - this.MappingColumns = new MappingColumnList(); - if (this.IgnoreColumns == null) - this.IgnoreColumns = new IgnoreColumnList(); - if (!this.MappingTables.Any(it => it.EntityName == entityInfo.EntityName)) + if (this.Context.MappingTables == null) + this.Context.MappingTables = new MappingTableList(); + if (this.Context.MappingColumns == null) + this.Context.MappingColumns = new MappingColumnList(); + if (this.Context.IgnoreColumns == null) + this.Context.IgnoreColumns = new IgnoreColumnList(); + if (!this.Context.MappingTables.Any(it => it.EntityName == entityInfo.EntityName)) { if (entityInfo.DbTableName != entityInfo.EntityName && entityInfo.DbTableName.HasValue()) { - this.MappingTables.Add(entityInfo.EntityName, entityInfo.DbTableName); + this.Context.MappingTables.Add(entityInfo.EntityName, entityInfo.DbTableName); } } if (entityInfo.Columns.Any(it => it.EntityName == entityInfo.EntityName)) { - var mappingColumnInfos = this.MappingColumns.Where(it => it.EntityName == entityInfo.EntityName); + var mappingColumnInfos = this.Context.MappingColumns.Where(it => it.EntityName == entityInfo.EntityName); foreach (var item in entityInfo.Columns.Where(it => it.IsIgnore == false)) { if (!mappingColumnInfos.Any(it => it.PropertyName == item.PropertyName)) if (item.PropertyName != item.DbColumnName && item.DbColumnName.HasValue()) - this.MappingColumns.Add(item.PropertyName, item.DbColumnName, item.EntityName); + this.Context.MappingColumns.Add(item.PropertyName, item.DbColumnName, item.EntityName); } - var ignoreInfos = this.IgnoreColumns.Where(it => it.EntityName == entityInfo.EntityName); + var ignoreInfos = this.Context.IgnoreColumns.Where(it => it.EntityName == entityInfo.EntityName); foreach (var item in entityInfo.Columns.Where(it => it.IsIgnore)) { if (!ignoreInfos.Any(it => it.PropertyName == item.PropertyName)) - this.IgnoreColumns.Add(item.PropertyName, item.EntityName); + this.Context.IgnoreColumns.Add(item.PropertyName, item.EntityName); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/IDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/IDbBind.cs index 7fb780149..03811c309 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/IDbBind.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/IDbBind.cs @@ -20,6 +20,6 @@ namespace SqlSugar string GetDbTypeName(string csharpTypeName); string GetCsharpTypeName(string dbTypeName); List> MappingTypes { get; } - List DataReaderToList(Type type, IDataReader reader, string fields); + List DataReaderToList(Type type, IDataReader reader); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ISqlBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ISqlBuilder.cs index f39a6d777..cec2a55fc 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ISqlBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Interface/ISqlBuilder.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Data; +using System.Dynamic; using System.Linq; +using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace SqlSugar @@ -12,8 +14,7 @@ namespace SqlSugar CommandType CommandType { get; set; } String AppendWhereOrAnd(bool isWhere, string sqlString); string AppendHaving(string sqlString); - string SqlTranslationLeft { get; } - string SqlTranslationRight { get; } + SqlQueryBuilder SqlQueryBuilder { get; set; } QueryBuilder QueryBuilder { get; set; } InsertBuilder InsertBuilder { get; set; } @@ -23,6 +24,9 @@ namespace SqlSugar string SqlParameterKeyWord { get; } string SqlFalse { get; } string SqlDateNow { get; } + string SqlTranslationLeft { get; } + string SqlTranslationRight { get; } + string SqlSelectAll { get; } string GetTranslationTableName(string name); string GetTranslationColumnName(string entityName, string propertyName); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj index 0e93431fa..fc4be8d95 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 4.6.0.6 + 4.6.0.9 sun_kai_xuan https://github.com/sunkaixuan/SqlSugar diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarClient.cs index d5fc40bd7..fcb82cd50 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarClient.cs @@ -310,6 +310,51 @@ namespace SqlSugar queryable.Where(joinExpression); return queryable; } + public virtual ISugarQueryable Queryable( + ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, Expression> joinExpression) where T : class, new() where T2 : class, new() + { + return Queryable(joinQueryable1, joinQueryable2, JoinType.Inner, joinExpression); + } + public virtual ISugarQueryable Queryable( + ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, JoinType joinType, Expression> joinExpression) where T : class, new() where T2 : class, new() + { + Check.Exception(joinQueryable1.QueryBuilder.Take != null || joinQueryable1.QueryBuilder.Skip != null || joinQueryable1.QueryBuilder.OrderByValue.HasValue(), "joinQueryable1 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + Check.Exception(joinQueryable2.QueryBuilder.Take != null || joinQueryable2.QueryBuilder.Skip != null || joinQueryable2.QueryBuilder.OrderByValue.HasValue(), "joinQueryable2 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + + var sqlBuilder = InstanceFactory.GetSqlbuilder(base.Context.CurrentConnectionConfig); + + sqlBuilder.Context = base.Context; + InitMppingInfo(); + var types = new Type[] { typeof(T2) }; + var queryable = InstanceFactory.GetQueryable(base.CurrentConnectionConfig); + queryable.Context = base.Context; + queryable.SqlBuilder = sqlBuilder; + queryable.QueryBuilder = InstanceFactory.GetQueryBuilder(base.CurrentConnectionConfig); + queryable.QueryBuilder.JoinQueryInfos = new List(); + queryable.QueryBuilder.Builder = sqlBuilder; + queryable.QueryBuilder.Context = base.Context; + queryable.QueryBuilder.EntityType = typeof(T); + queryable.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(base.CurrentConnectionConfig); + + //master + var shortName1 = joinExpression.Parameters[0].Name; + var sqlObj1 = joinQueryable1.ToSql(); + string sql1 = sqlObj1.Key; + UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0); + queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, shortName1); ; + queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value); + + //join table 1 + var shortName2 = joinExpression.Parameters[1].Name; + var sqlObj2 = joinQueryable2.ToSql(); + string sql2 = sqlObj2.Key; + UtilMethods.RepairReplicationParameters(ref sql2, sqlObj2.Value.ToArray(), 1); + queryable.QueryBuilder.Parameters.AddRange(sqlObj2.Value); + var exp = queryable.QueryBuilder.GetExpressionValue(joinExpression, ResolveExpressType.WhereMultiple); + queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 0, JoinType = joinType, JoinWhere = exp.GetResultString(), TableName = sqlBuilder.GetPackTable(sql2,shortName2)}); + + return queryable; + } #endregion public virtual ISugarQueryable UnionAll(params ISugarQueryable[] queryables) where T : class, new() @@ -333,7 +378,7 @@ namespace SqlSugar var allParameters = allItems.SelectMany(it => it.Value).ToArray(); var resulut = base.Context.Queryable().AS(UtilMethods.GetPackTable(allSql, "unionTable")); resulut.AddParameters(allParameters); - return resulut.Select("*"); + return resulut.Select(sqlBuilder.SqlSelectAll); } public virtual ISugarQueryable UnionAll(List> queryables) where T : class, new() { @@ -521,7 +566,7 @@ namespace SqlSugar public virtual EntityMaintenance EntityProvider { get { return base.Context.EntityMaintenance; } - set { base.Context.EntityMaintenance = value; } + set { base.Context.EntityMaintenance = value; } } public virtual EntityMaintenance EntityMaintenance { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec index 9e054cb07..706938cac 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec @@ -2,7 +2,7 @@ sqlSugarCore - 4.6.0.6 + 4.6.0.9 sunkaixuan Landa http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite index a9088fff8..88d6a78c3 100644 Binary files a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite and b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite differ