Lith 11 kuukautta sitten
vanhempi
commit
f153348212
43 muutettua tiedostoa jossa 17 lisäystä ja 4184 poistoa
  1. 0 19
      Vit.Linq.sln
  2. 2 2
      clean-temp.bat
  3. 3 3
      src/Test/Vit.Linq.ExpressionTree.MsTest/Vit.Linq.ExpressionTree.MsTest.csproj
  4. 6 6
      src/Test/Vit.Linq.MsTest/Vit.Linq.MsTest.csproj
  5. 6 6
      src/Test/Vit.Linq.MsTest31/Vit.Linq.MsTest31.csproj
  6. 0 279
      src/Test/Vit.Orm.Sqlite.MsTest/CRUD_Test.cs
  7. 0 66
      src/Test/Vit.Orm.Sqlite.MsTest/DataSource.cs
  8. 0 181
      src/Test/Vit.Orm.Sqlite.MsTest/Query_Group_Test.cs
  9. 0 218
      src/Test/Vit.Orm.Sqlite.MsTest/Query_InnerJoin_ByJoin_Test.cs
  10. 0 135
      src/Test/Vit.Orm.Sqlite.MsTest/Query_InnerJoin_BySelectMany_Test.cs
  11. 0 107
      src/Test/Vit.Orm.Sqlite.MsTest/Query_LeftJoin_ByGroupJoin_Test.cs
  12. 0 200
      src/Test/Vit.Orm.Sqlite.MsTest/Query_LeftJoin_BySelectMany_Test.cs
  13. 0 470
      src/Test/Vit.Orm.Sqlite.MsTest/Query_Test.cs
  14. 0 133
      src/Test/Vit.Orm.Sqlite.MsTest/Transaction_Test.cs
  15. 0 24
      src/Test/Vit.Orm.Sqlite.MsTest/Vit.Orm.Sqlite.MsTest.csproj
  16. 0 30
      src/Vit.Orm.Sqlite/DbContext_Extensions.cs
  17. 0 354
      src/Vit.Orm.Sqlite/Sql/BaseQueryTranslator.cs
  18. 0 65
      src/Vit.Orm.Sqlite/Sql/BatchDeleteTranslator.cs
  19. 0 90
      src/Vit.Orm.Sqlite/Sql/BatchUpdateTranslator.cs
  20. 0 131
      src/Vit.Orm.Sqlite/Sql/QueryTranslator.cs
  21. 0 325
      src/Vit.Orm.Sqlite/SqlTranslator.cs
  22. 0 21
      src/Vit.Orm.Sqlite/Vit.Orm.Sqlite.csproj
  23. 0 72
      src/Vit.Orm/DbContext.cs
  24. 0 43
      src/Vit.Orm/DbSet.cs
  25. 0 31
      src/Vit.Orm/Entity/ColumnDescriptor.cs
  26. 0 64
      src/Vit.Orm/Entity/Dapper/EntityDescriptor.cs
  27. 0 13
      src/Vit.Orm/Entity/IColumnDescriptor.cs
  28. 0 19
      src/Vit.Orm/Entity/IEntityDescriptor.cs
  29. 0 106
      src/Vit.Orm/README.md
  30. 0 191
      src/Vit.Orm/Sql/DataReader/EntityReader.cs
  31. 0 14
      src/Vit.Orm/Sql/DataReader/EntityReader/IArgReader.cs
  32. 0 35
      src/Vit.Orm/Sql/DataReader/EntityReader/ModelReader.EntityPropertyReader.cs
  33. 0 54
      src/Vit.Orm/Sql/DataReader/EntityReader/ModelReader.cs
  34. 0 41
      src/Vit.Orm/Sql/DataReader/EntityReader/SqlFieldReader.cs
  35. 0 51
      src/Vit.Orm/Sql/DataReader/EntityReader/TypeUtil.cs
  36. 0 25
      src/Vit.Orm/Sql/DataReader/EntityReader/ValueReader.cs
  37. 0 32
      src/Vit.Orm/Sql/DataReader/FirstEntityReader.cs
  38. 0 20
      src/Vit.Orm/Sql/DataReader/NumScalarReader.cs
  39. 0 9
      src/Vit.Orm/Sql/IDbDataReader.cs
  40. 0 46
      src/Vit.Orm/Sql/ISqlTranslator.cs
  41. 0 148
      src/Vit.Orm/Sql/SqlDbContext.cs
  42. 0 283
      src/Vit.Orm/Sql/SqlDbSet.cs
  43. 0 22
      src/Vit.Orm/Vit.Orm.csproj

+ 0 - 19
Vit.Linq.sln

@@ -18,12 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{75C25D0B-852
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vit.Linq.ExpressionTree.MsTest", "src\Test\Vit.Linq.ExpressionTree.MsTest\Vit.Linq.ExpressionTree.MsTest.csproj", "{5A6CE1E2-07A4-4C8D-AB99-D7AED536DAA6}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vit.Orm", "src\Vit.Orm\Vit.Orm.csproj", "{952A36C2-CE2C-416F-BFD0-EBDCA8A3056E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vit.Orm.Sqlite", "src\Vit.Orm.Sqlite\Vit.Orm.Sqlite.csproj", "{B8F1010C-9DC7-4C5A-B0B5-778279F2EDC9}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vit.Orm.Sqlite.MsTest", "src\Test\Vit.Orm.Sqlite.MsTest\Vit.Orm.Sqlite.MsTest.csproj", "{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -46,18 +40,6 @@ Global
 		{5A6CE1E2-07A4-4C8D-AB99-D7AED536DAA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{5A6CE1E2-07A4-4C8D-AB99-D7AED536DAA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5A6CE1E2-07A4-4C8D-AB99-D7AED536DAA6}.Release|Any CPU.Build.0 = Release|Any CPU
-		{952A36C2-CE2C-416F-BFD0-EBDCA8A3056E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{952A36C2-CE2C-416F-BFD0-EBDCA8A3056E}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{952A36C2-CE2C-416F-BFD0-EBDCA8A3056E}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{952A36C2-CE2C-416F-BFD0-EBDCA8A3056E}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B8F1010C-9DC7-4C5A-B0B5-778279F2EDC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B8F1010C-9DC7-4C5A-B0B5-778279F2EDC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B8F1010C-9DC7-4C5A-B0B5-778279F2EDC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B8F1010C-9DC7-4C5A-B0B5-778279F2EDC9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -66,7 +48,6 @@ Global
 		{5801E323-C03D-48D2-BEFF-DE060B3293B0} = {0062F400-558C-4084-8004-3C8D4CBBFDE4}
 		{7E513E2C-BF52-4662-AD8F-5910F283178D} = {0062F400-558C-4084-8004-3C8D4CBBFDE4}
 		{5A6CE1E2-07A4-4C8D-AB99-D7AED536DAA6} = {0062F400-558C-4084-8004-3C8D4CBBFDE4}
-		{C8F89EA5-5DB5-40C4-BF4B-6E31A3C0CB73} = {0062F400-558C-4084-8004-3C8D4CBBFDE4}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C7DA16E3-9949-49FA-B0B4-F830636DE60F}

+ 2 - 2
clean-temp.bat

@@ -1,5 +1,5 @@
 cd Publish\DevOps3\build-cmd
-VsTool.exe delete --path "..\..\.." --file "*.suo|*.user" --directory "obj|bin|.vs|packages"
+VsTool.exe delete --path "..\..\.." --file "*.suo|*.user" --directory "obj|bin|.vs|packages|TestResults"
 
 
 rd /s/q ..\..\release
@@ -7,4 +7,4 @@ rd /s/q ..\..\release
 
 echo %~n0.bat success£¡
 
-pause
+:: pause

+ 3 - 3
src/Test/Vit.Linq.ExpressionTree.MsTest/Vit.Linq.ExpressionTree.MsTest.csproj

@@ -7,9 +7,9 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
-        <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
-        <PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
+        <PackageReference Include="MSTest.TestAdapter" Version="3.4.3" />
+        <PackageReference Include="MSTest.TestFramework" Version="3.4.3" />
 
         <PackageReference Include="Vit.Core" Version="2.1.21" />
         <PackageReference Include="Sers.Core" Version="2.1.24" />

+ 6 - 6
src/Test/Vit.Linq.MsTest/Vit.Linq.MsTest.csproj

@@ -7,13 +7,13 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
-        <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
-        <PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
-        <PackageReference Include="Vit.Core" Version="2.1.20" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
+        <PackageReference Include="MSTest.TestAdapter" Version="3.4.3" />
+        <PackageReference Include="MSTest.TestFramework" Version="3.4.3" />
+        <PackageReference Include="Vit.Core" Version="2.1.21" />
 
-        <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-        <PackageReference Include="System.Text.Json" Version="6.0.0" />
+        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+        <PackageReference Include="System.Text.Json" Version="8.0.3" />
     </ItemGroup>
 
     <ItemGroup>

+ 6 - 6
src/Test/Vit.Linq.MsTest31/Vit.Linq.MsTest31.csproj

@@ -6,13 +6,13 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
-        <PackageReference Include="MSTest.TestAdapter" Version="2.1.2" />
-        <PackageReference Include="MSTest.TestFramework" Version="2.1.2" />
-        <PackageReference Include="Vit.Core" Version="2.1.20" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
+        <PackageReference Include="MSTest.TestAdapter" Version="3.4.3" />
+        <PackageReference Include="MSTest.TestFramework" Version="3.4.3" />
+        <PackageReference Include="Vit.Core" Version="2.1.21" />
 
-        <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-        <PackageReference Include="System.Text.Json" Version="6.0.0" />
+        <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+        <PackageReference Include="System.Text.Json" Version="8.0.3" />
     </ItemGroup>
 
     <ItemGroup>

+ 0 - 279
src/Test/Vit.Orm.Sqlite.MsTest/CRUD_Test.cs

@@ -1,279 +0,0 @@
-
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-
-    [TestClass]
-    public class CRUD_Test
-    {
-        #region #1 Create
-
-        [TestMethod]
-        public void Test_Create()
-        {
-            var user = new User { id = 7, name = "testUser7", birth = DateTime.Now, fatherId = 1, motherId = 2 };
-            var user2 = new User { id = 8, name = "testUser8", birth = DateTime.Now, fatherId = 3, motherId = 4 };
-
-            // #1 Add
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                dbContext.Add(user);
-
-                Assert.AreEqual(7, userQuery.Count());
-
-                var newUser = userQuery.FirstOrDefault(m => m.id == 7);
-                Assert.AreEqual(user.id, newUser?.id);
-                Assert.AreEqual(user.name, newUser?.name);
-            }
-
-            // #2 AddRange
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                dbContext.AddRange(new[] { user, user2 });
-
-                Assert.AreEqual(8, userQuery.Count());
-
-                var newUsers = userQuery.Where(m => m.id >= 7).ToList();
-                Assert.AreEqual(2, newUsers.Count());
-                Assert.AreEqual(user.id, newUsers[0]?.id);
-                Assert.AreEqual(user2.id, newUsers[1]?.id);
-            }
-
-        }
-        #endregion
-
-
-        #region #3 Update
-
-        [TestMethod]
-        public void Test_Update()
-        {
-            var user = new User { id = 4, name = "testUser4", birth = DateTime.Now, fatherId = 14 };
-            var user2 = new User { id = 5, name = "testUser5", birth = DateTime.Now, fatherId = 15 };
-
-            #region Update
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.Update(user);
-                Assert.AreEqual(1, rowCount);
-
-                var newUser = userQuery.FirstOrDefault(m => m.id == 4);
-                Assert.AreEqual(4, newUser.id);
-                Assert.AreEqual(user.name, newUser.name);
-                Assert.AreEqual(user.birth, newUser.birth);
-                Assert.AreEqual(user.fatherId, newUser.fatherId);
-            }
-            #endregion
-
-            #region UpdateRange
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.UpdateRange(new[] { user, user2 });
-                Assert.AreEqual(2, rowCount);
-
-                var newUsers = userQuery.Where(m => m.id == 4 || m.id == 5).ToList();
-                Assert.AreEqual(user.id, newUsers[0].id);
-                Assert.AreEqual(user.name, newUsers[0].name);
-                Assert.AreEqual(user2.id, newUsers[1].id);
-                Assert.AreEqual(user2.name, newUsers[1].name);
-            }
-            #endregion
-
-        }
-
-
-        [TestMethod]
-        public void Test_ExecuteUpdate()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var count = userQuery.ExecuteUpdate(row => new User
-                {
-                    name = "u_" + row.id + "_" + (row.fatherId.ToString() ?? "") + "_" + (row.motherId.ToString() ?? "")
-                });
-
-                Assert.AreEqual(6, count);
-
-                var userList = userQuery.ToList();
-                Assert.AreEqual("u_1_4_6", userList.First().name);
-                Assert.AreEqual("u_6__", userList.Last().name);
-            }
-
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             select new
-                             {
-                                 user,
-                                 father,
-                                 motherId = user.motherId
-                             });
-
-                var count = query.ExecuteUpdate(row => new User
-                {
-                    name = "u2_" + row.user.id + "_" + (row.father.id.ToString() ?? "") + "_" + (row.motherId.ToString() ?? "")
-                });
-                Assert.AreEqual(6, count);
-
-
-                var userList = userQuery.ToList();
-                Assert.AreEqual("u2_1_4_6", userList.First().name);
-                Assert.AreEqual("u2_6__", userList.Last().name);
-            }
-
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             where user.id <= 5 && father != null
-                             select new
-                             {
-                                 user,
-                                 father,
-                                 motherId = user.motherId
-                             });
-
-                var count = query.ExecuteUpdate(row => new User
-                {
-                    name = "u3_" + row.user.id + "_" + (row.father.id.ToString() ?? "") + "_" + (row.motherId.ToString() ?? "")
-                });
-                Assert.AreEqual(3, count);
-
-
-                var userList = userQuery.ToList();
-                Assert.AreEqual("u3_1_4_6", userList[0].name);
-                Assert.AreEqual("u3_3_5_6", userList[2].name);
-                Assert.AreEqual("u2_4__", userList[3].name);
-            }
-        }
-        #endregion
-
-
-        #region #4 Delete
-
-
-        [TestMethod]
-        public void Test_Delete()
-        {
-
-            #region #1 Delete
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.Delete(new User { id = 5 });
-
-                Assert.AreEqual(1, rowCount);
-                Assert.AreEqual(5, userQuery.Count());
-            }
-            #endregion
-
-            #region #2 DeleteRange
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.DeleteRange(new[] { new User { id = 5 }, new User { id = 6 }, new User { id = 10 } });
-
-                Assert.AreEqual(2, rowCount);
-                Assert.AreEqual(4, userQuery.Count());
-            }
-            #endregion
-
-            #region #3 DeleteByKey
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.DeleteByKey<User>(4);
-                Assert.AreEqual(1, rowCount);
-                Assert.AreEqual(5, userQuery.Count());
-            }
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = dbContext.DeleteByKey<User>(7);
-                Assert.AreEqual(0, rowCount);
-                Assert.AreEqual(6, userQuery.Count());
-            }
-            #endregion
-
-
-            #region #4 DeleteByKeys
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userSet = dbContext.DbSet<User>();
-
-                var rowCount = userSet.DeleteByKeys(new[] { 5, 6, 10 });
-
-                Assert.AreEqual(2, rowCount);
-                Assert.AreEqual(4, userSet.Query().Count());
-            }
-            #endregion
-        }
-
-
-
-        [TestMethod]
-        public void Test_ExecuteDelete()
-        {
-            if (1 == 1)
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             where user.id <= 5 && father != null
-                             select new
-                             {
-                                 user,
-                                 father
-                             });
-
-                var rowCount = query.ExecuteDelete();
-
-                Assert.AreEqual(3, rowCount);
-
-                var newUsers = userQuery.ToList();
-                Assert.AreEqual(3, newUsers.Count());
-                Assert.AreEqual(4, newUsers.First().id);
-                Assert.AreEqual(6, newUsers.Last().id);
-            }
-
-            if (1 == 1)
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var userQuery = dbContext.Query<User>();
-
-                var rowCount = userQuery.Where(m => m.id == 2 || m.id == 4).ExecuteDelete();
-
-                Assert.AreEqual(2, rowCount);
-
-                var newUsers = userQuery.ToList();
-                Assert.AreEqual(4, newUsers.Count());
-                Assert.AreEqual(1, newUsers.First().id);
-                Assert.AreEqual(3, newUsers[1].id);
-                Assert.AreEqual(5, newUsers[2].id);
-            }
-        }
-        #endregion
-
-
-    }
-}

+ 0 - 66
src/Test/Vit.Orm.Sqlite.MsTest/DataSource.cs

@@ -1,66 +0,0 @@
-using Dapper.Contrib.Extensions;
-
-using Vit.Orm.Sql;
-using Vit.Extensions;
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [Table("User")]
-    public class User
-    {
-        [Key]
-        //[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
-        public int id { get; set; }
-        public string name { get; set; }
-        public DateTime? birth { get; set; }
-
-        public int? fatherId { get; set; }
-        public int? motherId { get; set; }
-    }
-
-
-    public class DataSource
-    {
-        public static DbContext CreateDbContext(string dbName = "DataSource")
-        {
-            var filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, $"{dbName}.db");
-            var dbContext = new SqlDbContext();
-            dbContext.UseSqlite($"data source={filePath}");
-            return dbContext;
-            //return CreateFormatedDbContext(dbName);
-        }
-
-        public static DbContext CreateFormatedDbContext(string dbName = "DataSource")
-        {
-            var filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, $"{dbName}.db");
-            if (File.Exists(filePath)) File.Delete(filePath);
-            File.WriteAllBytes(filePath, new byte[0]);
-
-
-            var connectionString = $"data source={filePath}";
-            //connectionString = $"Data Source={dbName};Mode=Memory;Cache=Shared";
-            //connectionString = $"Data Source=:memory:";
-
-            var dbContext = new SqlDbContext();
-            dbContext.UseSqlite(connectionString);
-
-            var userSet = dbContext.DbSet<User>();
-            userSet.Create();
-
-            var users = new List<User> {
-                    new User { id=1, name="u1", fatherId=4, motherId=6 },
-                    new User { id=2, name="u2", fatherId=4, motherId=6 },
-                    new User { id=3, name="u3", fatherId=5, motherId=6 },
-                    new User { id=4, name="u4" },
-                    new User { id=5, name="u5" },
-                    new User { id=6, name="u6" },
-                };
-            users.ForEach(user => { user.birth = DateTime.Parse("2021-01-01 00:00:00").AddHours(user.id); });
-
-            dbContext.AddRange(users);
-
-            return dbContext;
-        }
-
-    }
-}

+ 0 - 181
src/Test/Vit.Orm.Sqlite.MsTest/Query_Group_Test.cs

@@ -1,181 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [TestClass]
-    public class Query_Group_Test
-    {
-
-        [TestMethod]
-        public void Test_Group_Demo()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                        from user in userQuery
-                        group user by new { user.fatherId, user.motherId } into userGroup
-                        select new { userGroup.Key.fatherId, userGroup.Key.motherId  };
-            
-                var sql = query.ToExecuteString();
-                var rows = query.ToList();
-
-                Assert.AreEqual(3, rows.Count);
-                Assert.AreEqual(4, rows[1].fatherId);
-                Assert.AreEqual(6, rows[1].motherId);
-                Assert.AreEqual(5, rows[2].fatherId);
-                Assert.AreEqual(6, rows[2].motherId);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                        userQuery
-                        .GroupBy(user => new { user.fatherId, user.motherId })
-                        .Select(userGroup => new
-                        {
-                            userGroup.Key.fatherId,
-                            userGroup.Key.motherId
-                        })
-                        ;
-
-                var sql = query.ToExecuteString();
-                var rows = query.ToList();
-
-                Assert.AreEqual(3, rows.Count);
-                Assert.AreEqual(4, rows[1].fatherId);
-                Assert.AreEqual(6, rows[1].motherId);
-                Assert.AreEqual(5, rows[2].fatherId);
-                Assert.AreEqual(6, rows[2].motherId);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_Group_Complex()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                        from user in userQuery.Where(u => u.id > 1)
-                        group user by new { user.fatherId, user.motherId } into userGroup
-                        where userGroup.Key.motherId != null
-                        orderby userGroup.Key.fatherId descending
-                        select new { userGroup.Key.fatherId, userGroup.Key.motherId, rowCount = userGroup.Count(), maxId = userGroup.Max(m => m.id) };
-
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var rows = query.ToList();
-
-                Assert.AreEqual(1, rows.Count);
-                Assert.AreEqual(4, rows[0].fatherId);
-                Assert.AreEqual(6, rows[0].motherId);
-                Assert.AreEqual(1, rows[0].rowCount);
-                Assert.AreEqual(2, rows[0].maxId);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                        userQuery
-                        .Where(u => u.id > 1)
-                        .GroupBy(user => new { user.fatherId, user.motherId })
-                        .Where(userGroup => userGroup.Key.motherId != null)
-                        .OrderByDescending(userGroup => userGroup.Key.fatherId)
-                        .Select(userGroup => new
-                        {
-                            userGroup.Key.fatherId,
-                            userGroup.Key.motherId,
-                            rowCount = userGroup.Count(),
-                            maxId = userGroup.Max(m => m.id)
-                        })
-                        .Skip(1)
-                        .Take(1)
-                        ;
-
-                var sql = query.ToExecuteString();
-                var rows = query.ToList();
-
-                Assert.AreEqual(1, rows.Count);
-                Assert.AreEqual(4, rows[0].fatherId);
-                Assert.AreEqual(6, rows[0].motherId);
-                Assert.AreEqual(1, rows[0].rowCount);
-                Assert.AreEqual(2, rows[0].maxId);
-            }
-        }
-
-
-
-
-        [TestMethod]
-        public void Test_Others()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var query =
-                    userQuery
-                    .GroupBy(user => new { user.fatherId, user.motherId })
-                    .Select(userGroup => new
-                    {
-                        userGroup.Key.fatherId,
-                        rowCount = userGroup.Count(),
-                        maxId = userGroup.Max(m => m.id),
-                        minId = userGroup.Min(m => m.id),
-                        sumId = userGroup.Sum(m => m.id),
-                        avgId = userGroup.Average(m => m.id)
-                    })
-                    ;
-
-                var sql = query.ToExecuteString();
-                var rows = query.ToList();
-
-                Assert.AreEqual(3, rows.Count);
-                Assert.AreEqual(2, rows[1].rowCount);
-                Assert.AreEqual(1.5, rows[1].avgId);
-            }
-            {
-                var query =
-                    userQuery
-                    .GroupBy(user => new { user.fatherId, user.motherId })
-                    .Where(userGroup => userGroup.Key.motherId != null)
-                    .OrderByDescending(userGroup => userGroup.Key.fatherId)
-                    .Select(userGroup => new { userGroup.Key.fatherId, userGroup.Key.motherId })
-                    ;
-
-                var rows = query.ToList();
-                var sql = query.ToExecuteString();
-
-                Assert.AreEqual(2, rows.Count);
-                Assert.AreEqual(5, rows[0].fatherId);
-            }
-            {
-                var query =
-                    userQuery
-                    .GroupBy(user => user.fatherId)
-                    .Where(userGroup => userGroup.Key != null)
-                    .OrderByDescending(userGroup => userGroup.Key)
-                    .Select(userGroup => new { fatherId = userGroup.Key, rowCount = userGroup.Count() })
-                    ;
-
-                var rows = query.ToList();
-                var sql = query.ToExecuteString();
-
-                Assert.AreEqual(2, rows.Count);
-                Assert.AreEqual(5, rows[0].fatherId);
-            }
-        }
-
-
-    }
-}

+ 0 - 218
src/Test/Vit.Orm.Sqlite.MsTest/Query_InnerJoin_ByJoin_Test.cs

@@ -1,218 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [TestClass]
-    public class Query_InnerJoin_ByJoin_Test
-    {
-
-        [TestMethod]
-        public void Test_InnerJoin_Demo()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id)
-                    where user.id > 2
-                    select new { user, father };
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-                Assert.AreEqual(5, userList.First().father.id);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                    userQuery.SelectMany(
-                        user => userQuery.Where(father => user.fatherId == father.id)
-                        , (user, father) => new { user, father }
-                    )
-                    .Where(row => row.user.id > 2)
-                    .Select(row => new { row.user, row.father });
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-                Assert.AreEqual(5, userList.First().father.id);
-            }
-
-        }
-
-
-        [TestMethod]
-        public void Test_InnerJoin_Complex()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    join father in userQuery on user.fatherId equals father.id
-                    join mother in userQuery on user.motherId equals mother.id
-                    where user.id > 1
-                    orderby father.id descending
-                    select new
-                    {
-                        user,
-                        father,
-                        mother,
-                        testId = user.id + 100,
-                        hasFather = father != null ? true : false
-                    };
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(2, first.user.id);
-                Assert.AreEqual(4, first.father.id);
-                Assert.AreEqual(6, first.mother.id);
-                Assert.AreEqual(102, first.testId);
-                Assert.AreEqual(true, first.hasFather);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                    userQuery.Join(
-                        userQuery
-                        , user => user.fatherId
-                        , father => father.id
-                        , (user, father) => new { user, father }
-                    ).Join(
-                        userQuery
-                        , row => row.user.motherId
-                        , mother => mother.id
-                        , (row, mother) => new { row, mother }
-                    )
-                    .Where(row2 => row2.row.user.id > 1)
-                    .OrderByDescending(row2 => row2.row.father.id)
-                    .Select(row2 =>
-                        new
-                        {
-                            row2.row.user,
-                            row2.row.father,
-                            row2.mother,
-                            testId = row2.row.user.id + 100,
-                            hasFather = row2.row.father != null ? true : false
-                        }
-                    );
-
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(2, first.user.id);
-                Assert.AreEqual(4, first.father.id);
-                Assert.AreEqual(6, first.mother.id);
-                Assert.AreEqual(102, first.testId);
-                Assert.AreEqual(true, first.hasFather);
-            }
-        }
-
-
-
-        [TestMethod]
-        public void Test_InnerJoin_Others()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // simple
-            {
-                var query =
-                    userQuery.Join(
-                        userQuery
-                        , user => user.fatherId
-                        , father => father.id
-                        , (user, father) => new { user, father }
-                    );
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(3, userList.Count);
-                Assert.AreEqual(1, userList.First().user.id);
-            }
-
-            // where
-            {
-                var query =
-                    userQuery.Join(
-                        userQuery
-                        , user => user.fatherId
-                        , father => father.id
-                        , (user, father) => new { user, father }
-                    ).Where(row => row.user.id > 2);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-            }
-            // select
-            {
-                var query =
-                    userQuery.Join(
-                        userQuery
-                        , user => user.fatherId
-                        , father => father.id
-                        , (user, father) => new { user, father }
-                    ).Where(row => row.user.id > 2)
-                    .Select(row => new { userId = row.user.id, fatherId = row.father.id });
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().userId);
-                Assert.AreEqual(5, userList.First().fatherId);
-            }
-            // full feature
-            {
-                var query =
-                         from user in userQuery
-                         join father in userQuery on user.fatherId equals father.id
-                         where user.id > 1
-                         orderby user.id descending
-                         select new { user, father };
-
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(2, userList.First().user.id);
-            }
-
-        }
-
-
-
-
-    }
-}

+ 0 - 135
src/Test/Vit.Orm.Sqlite.MsTest/Query_InnerJoin_BySelectMany_Test.cs

@@ -1,135 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [TestClass]
-    public class Query_InnerJoin_BySelectMany_Test
-    {
-
-        [TestMethod]
-        public void Test_InnerJoin_Demo()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id)
-                    where user.id > 2
-                    select new { user, father };
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-                Assert.AreEqual(5, userList.First().father.id);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                    userQuery.SelectMany(
-                        user => userQuery.Where(father => user.fatherId == father.id)
-                        , (user, father) => new { user, father }
-                    )
-                    .Where(row => row.user.id > 2)
-                    .Select(row => new { row.user, row.father });
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-                Assert.AreEqual(5, userList.First().father.id);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_InnerJoin_Complex()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id)
-                    from mother in userQuery.Where(mother => user.motherId == mother.id)
-                    where user.id > 1
-                    orderby father.id descending
-                    select new
-                    {
-                        user,
-                        father,
-                        mother,
-                        testId = user.id + 100,
-                        hasFather = father != null ? true : false
-                    };
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(2, first.user.id);
-                Assert.AreEqual(4, first.father.id);
-                Assert.AreEqual(6, first.mother.id);
-                Assert.AreEqual(102, first.testId);
-                Assert.AreEqual(true, first.hasFather);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                    userQuery.SelectMany(
-                        user => userQuery.Where(father => user.fatherId == father.id)
-                        , (user, father) => new { user, father }
-                    ).SelectMany(
-                        row => userQuery.Where(mother => row.user.motherId == mother.id)
-                        , (row, mother) => new { row, mother }
-                    )
-                    .Where(row2 => row2.row.user.id > 1)
-                    .OrderByDescending(row2 => row2.row.father.id)
-                    .Select(row2 =>
-                        new
-                        {
-                            row2.row.user,
-                            row2.row.father,
-                            row2.mother,
-                            testId = row2.row.user.id + 100,
-                            hasFather = row2.row.father != null ? true : false
-                        }
-                    );
-
-                query = query.Skip(1).Take(1);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(2, first.user.id);
-                Assert.AreEqual(4, first.father.id);
-                Assert.AreEqual(6, first.mother.id);
-                Assert.AreEqual(102, first.testId);
-                Assert.AreEqual(true, first.hasFather);
-            }
-        }
-
-
- 
-
-
-    }
-}

+ 0 - 107
src/Test/Vit.Orm.Sqlite.MsTest/Query_LeftJoin_ByGroupJoin_Test.cs

@@ -1,107 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [TestClass]
-    public class Query_LeftJoin_ByGroupJoin_Test
-    {
-        [TestMethod]
-        public void Test_LeftJoin_Demo()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    join father in userQuery on user.fatherId equals father.id into fathers
-                    from father in fathers.DefaultIfEmpty()
-                    where user.id > 2
-                    select new { user, father };
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(4, userList.Count);
-                Assert.AreEqual(3, userList[0].user.id);
-                Assert.AreEqual(5, userList[0].father?.id);
-                Assert.AreEqual(4, userList[1].user.id);
-                Assert.AreEqual(null, userList[1].father?.id);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                    userQuery.GroupJoin(
-                        userQuery
-                        , user => user.fatherId
-                        , father => father.id
-                        , (user, fathers) => new { user, fathers }
-                    )
-                    .SelectMany(
-                        row => row.fathers.DefaultIfEmpty()
-                        , (row, father) => new { row, father }
-                    )
-                    .Where(row2 => row2.row.user.id > 2)
-                    .Select(row2 => new { row2.row.user, row2.father });
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(4, userList.Count);
-                Assert.AreEqual(3, userList[0].user.id);
-                Assert.AreEqual(5, userList[0].father?.id);
-                Assert.AreEqual(4, userList[1].user.id);
-                Assert.AreEqual(null, userList[1].father?.id);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_LeftJoin_Complex()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    join father in userQuery on user.fatherId equals father.id into fathers
-                    from father in fathers.DefaultIfEmpty()
-                    join mother in userQuery on user.motherId equals mother.id into mothers
-                    from mother in mothers.DefaultIfEmpty()
-                    where user.id > 2
-                    orderby father.id descending
-                    select new
-                    {
-                        user,
-                        father,
-                        mother,
-                        testId = user.id + 100,
-                        hasFather = father != null ? true : false
-                    };
-
-                query = query.Skip(1).Take(2);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(2, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(4, first.user.id);
-                Assert.AreEqual(null, first.father?.id);
-                Assert.AreEqual(null, first.mother?.id);
-                Assert.AreEqual(104, first.testId);
-                Assert.AreEqual(false, first.hasFather);
-            }
-        }
-
-
-    }
-}

+ 0 - 200
src/Test/Vit.Orm.Sqlite.MsTest/Query_LeftJoin_BySelectMany_Test.cs

@@ -1,200 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-    [TestClass]
-    public class Query_LeftJoin_BySelectMany_Test
-    {
-
-
-
-
-        [TestMethod]
-        public void Test_LeftJoin_Demo()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                        from user in userQuery
-                        from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                        where user.id > 2
-                        select new { user, father };
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(4, userList.Count);
-                Assert.AreEqual(3, userList[0].user.id);
-                Assert.AreEqual(5, userList[0].father?.id);
-                Assert.AreEqual(4, userList[1].user.id);
-                Assert.AreEqual(null, userList[1].father?.id);
-            }
-
-            // Lambda Expression
-            {
-                var query =
-                        userQuery.SelectMany(
-                            user => userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                            , (user, father) => new { user, father }
-                        )
-                        .Where(row => row.user.id > 2)
-                        .Select(row => new { row.user, row.father });
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(4, userList.Count);
-                Assert.AreEqual(3, userList[0].user.id);
-                Assert.AreEqual(5, userList[0].father?.id);
-                Assert.AreEqual(4, userList[1].user.id);
-                Assert.AreEqual(null, userList[1].father?.id);
-            }
-        }
-
-
-
-        [TestMethod]
-        public void Test_LeftJoin_Complex()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            // Linq Expresssion
-            {
-                var query =
-                    from user in userQuery
-                    from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                    from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                    where user.id > 2
-                    orderby father.id descending
-                    select new
-                    {
-                        user,
-                        father,
-                        mother,
-                        testId = user.id + 100,
-                        hasFather = father != null ? true : false
-                    };
-
-                query = query.Skip(1).Take(2);
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(2, userList.Count);
-
-                var first = userList.First();
-                Assert.AreEqual(4, first.user.id);
-                Assert.AreEqual(null, first.father?.id);
-                Assert.AreEqual(null, first.mother?.id);
-                Assert.AreEqual(104, first.testId);
-                Assert.AreEqual(false, first.hasFather);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_MultipleSelect()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             where user.id > 2 && father != null
-                             select new
-                             {
-                                 user,
-                                 father
-                             });
-
-                var userList = query.ToList();
-
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().user.id);
-            }
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id)
-                             from mother in userQuery.Where(mother => user.motherId == mother.id)
-                             select new
-                             {
-                                 uniqueId = user.id + "_" + father.id + "_" + mother.id,
-                                 uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
-                                 user,
-                                 user2 = user,
-                                 user3 = user,
-                                 father,
-                                 hasFather = user.fatherId != null ? true : false,
-                                 fatherName = father.name,
-                                 mother
-                             });
-
-                var userList = query.ToList();
-                Assert.AreEqual(3, userList.Count);
-                Assert.AreEqual(1, userList.First().user.id);
-                Assert.AreEqual(3, userList.Last().user.id);
-                Assert.AreEqual(5, userList.Last().father?.id);
-            }
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             from mother in userQuery.Where(mother => user.motherId == mother.id).DefaultIfEmpty()
-                             select new
-                             {
-                                 user,
-                                 father,
-                                 userId = user.id + 100,
-                                 hasFather = user.fatherId != null ? true : false,
-                                 hasFather2 = father != null,
-                                 fatherName = father.name,
-                                 motherName = mother.name,
-                             });
-
-                var userList = query.ToList();
-
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual(1, userList.First().user.id);
-                Assert.AreEqual(101, userList.First().userId);
-                Assert.AreEqual(6, userList.Last().user.id);
-                Assert.AreEqual(5, userList[2].father.id);
-            }
-
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id)
-                             from mother in userQuery.Where(mother => user.motherId == mother.id)
-                             where user.id > 1
-                             orderby father.id descending
-                             select new
-                             {
-                                 user,
-                                 father,
-                                 userId = user.id + 100,
-                                 hasFather = user.fatherId != null ? true : false,
-                                 hasFather2 = father != null,
-                                 fatherName = father.name,
-                                 motherName = mother.name,
-                             });
-
-                var userList = query.ToList();
-
-                Assert.AreEqual(2, userList.Count);
-                Assert.AreEqual(5, userList.First().father?.id);
-                Assert.AreEqual(4, userList.Last().father?.id);
-            }
-
-        }
-
-
-    }
-}

+ 0 - 470
src/Test/Vit.Orm.Sqlite.MsTest/Query_Test.cs

@@ -1,470 +0,0 @@
-
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Vit.Extensions.Linq_Extensions;
-using System.Data;
-using static Vit.Core.Util.XmlComment.MethodComment;
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-
-    [TestClass]
-    public class Query_Test
-    {
-        [TestMethod]
-        public void Test_Get()
-        {
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var user = dbContext.Get<User>(3);
-                Assert.AreEqual(3, user?.id);
-            }
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-                var user = dbContext.DbSet<User>().Get(5);
-                Assert.AreEqual(5, user?.id);
-            }
-        }
-
-
-
-
-        [TestMethod]
-        public void Test_PlainQuery()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var userList = userQuery.ToList();
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual(1, userList.First().id);
-                Assert.AreEqual(6, userList.Last().id);
-            }
-
-
-            {
-                var userList = userQuery.Select(u => u.id).ToList();
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual(1, userList.First());
-                Assert.AreEqual(6, userList.Last());
-            }
-        }
-
-
-
-        [TestMethod]
-        public void Test_Where()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var userList = userQuery.Where(u => u.id > 2).Where(m => m.id < 4).ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-            }
-            {
-                var userList = userQuery.Where(u => u.id + 1 == 4).Where(m => m.fatherId == 5).ToList();
-                Assert.AreEqual(3, userList.First().id);
-            }
-            {
-                var userList = userQuery.Where(u => 4 == u.id + 1).Where(m => m.fatherId == 5).ToList();
-                Assert.AreEqual(3, userList.First().id);
-            }
-
-
-            {
-                var userList = userQuery.Where(u => u.birth == new DateTime(2021, 01, 01, 03, 00, 00)).ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-            }
-            {
-                var userList = userQuery.Where(u => u.birth == DateTime.Parse("2021-01-01 01:00:00").AddHours(2)).ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-            }
-        }
-
-        [TestMethod]
-        public void Test_Select()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var userList = userQuery.Select(u => u).Where(user => user.id > 2).Where(user => user.id < 4).Select(u => u).ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-            }
-
-
-            {
-                var userList = (from user in userQuery
-                                select new
-                                {
-                                    uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
-                                    uniqueId2 = $"{user.id}_{user.fatherId}_{user.motherId}"
-                                }).ToList();
-
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual("1_4_6", userList.First().uniqueId1);
-            }
-
-        }
-
-        [TestMethod]
-        public void Test_Count()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var count = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             where user.id > 2 && father == null
-                             select new
-                             {
-                                 father
-                             }).Count();
-
-                Assert.AreEqual(3, count);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_AllFeatures()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            #region SelectMany().Where().OrderBy().Skip().Take().ToExecuteString()
-            /*
-            users.SelectMany(
-                user => users.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                , (user, father) => new {user = user, father = father}
-            ).Where(row => row.user.id > 2)
-            .Select(row => new {row.user })
-            .OrderBy(user=>user.id)
-            .Skip(1).Take(2);
-             */
-            {
-                var query = (from user in userQuery
-                             from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                             where user.id > 2
-                             orderby father.id, user.id descending
-                             select new
-                             {
-                                 user
-                             })
-                            .Skip(1).Take(2);
-
-                var sql = query.ToExecuteString();
-                var list = query.ToList();
-
-                Assert.AreEqual(2, list.Count);
-                Assert.AreEqual(5, list[0].user.id);
-                Assert.AreEqual(4, list[1].user.id);
-            }
-            #endregion
-        }
-
-
-
-        [TestMethod]
-        public void Test_FirstOrDefault()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var user = userQuery.FirstOrDefault();
-                Assert.AreEqual(1, user?.id);
-            }
-
-            {
-                var user = userQuery.FirstOrDefault(user => user.id == 3);
-                Assert.AreEqual(3, user?.id);
-            }
-
-            {
-                var user = userQuery.FirstOrDefault(user => user.id == 13);
-                Assert.AreEqual(null, user?.id);
-            }
-
-            {
-                var user = userQuery.OrderByDescending(m => m.id).FirstOrDefault();
-                Assert.AreEqual(6, user?.id);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_First()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var user = userQuery.First();
-                Assert.AreEqual(1, user?.id);
-            }
-
-            {
-                var user = userQuery.First(user => user.id == 3);
-                Assert.AreEqual(3, user?.id);
-            }
-
-            {
-                try
-                {
-                    var user = userQuery.First(user => user.id == 13);
-                    Assert.Fail("IQueryalbe.First should throw Exception");
-                }
-                catch (Exception ex)
-                {
-                }
-
-            }
-
-        }
-
-
-
-        [TestMethod]
-        public void Test_LastOrDefault()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var user = userQuery.LastOrDefault();
-                Assert.AreEqual(6, user?.id);
-            }
-
-            {
-                var user = userQuery.LastOrDefault(user => user.id == 3);
-                Assert.AreEqual(3, user?.id);
-            }
-
-            {
-                var user = userQuery.LastOrDefault(user => user.id == 13);
-                Assert.AreEqual(null, user?.id);
-            }
-
-            {
-                var user = userQuery.OrderByDescending(m => m.id).LastOrDefault();
-                Assert.AreEqual(1, user?.id);
-            }
-        }
-
-
-        [TestMethod]
-        public void Test_Last()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var user = userQuery.Last();
-                Assert.AreEqual(6, user?.id);
-            }
-
-            {
-                var user = userQuery.Last(user => user.id == 3);
-                Assert.AreEqual(3, user?.id);
-            }
-
-            {
-                try
-                {
-                    var user = userQuery.Last(user => user.id == 13);
-                    Assert.Fail("IQueryalbe.First should throw Exception");
-                }
-                catch (Exception ex)
-                {
-                }
-
-            }
-
-        }
-
-        // Enumerable.ToArray
-        [TestMethod]
-        public void Test_Enumerable_ToArray()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var userList = userQuery.ToArray();
-                Assert.AreEqual(6, userList.Length);
-                Assert.AreEqual(1, userList.First().id);
-                Assert.AreEqual(6, userList.Last().id);
-            }
-
-
-            {
-                var userList = userQuery.Select(u => u.id).ToArray();
-                Assert.AreEqual(6, userList.Length);
-                Assert.AreEqual(1, userList.First());
-                Assert.AreEqual(6, userList.Last());
-            }
-        }
-
-
-
-        // Enumerable.Contains
-        // Queryable.Contains
-        [TestMethod]
-        public void Test_Contains()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var userList = userQuery.Where(u => new[] { 3, 5 }.Contains(u.id)).ToList();
-                Assert.AreEqual(2, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual(5, userList.Last().id);
-            }
-            {
-                var ids = new[] { 3, 5 }.AsEnumerable();
-                var userList = userQuery.Where(u => ids.Contains(u.id)).ToList();
-                Assert.AreEqual(2, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual(5, userList.Last().id);
-            }
-            {
-                var ids = new[] { 3, 5 }.AsQueryable();
-                var userList = userQuery.Where(u => ids.Contains(u.id)).ToList();
-                Assert.AreEqual(2, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual(5, userList.Last().id);
-            }
-        }
-
-        [TestMethod]
-        public void Test_StringMethods()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            userQuery.ExecuteUpdate(row => new User
-            {
-                name = "u|" + row.id + "|" + (row.fatherId.ToString() ?? "") + "|" + (row.motherId.ToString() ?? "")
-            });
-
-            // StartsWith
-            {
-                var query = userQuery.Where(u => u.name.StartsWith("u|3|5"));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual("u|3|5|6", userList.First().name);
-            }
-            // EndsWith
-            {
-                var query = userQuery.Where(u => u.name.EndsWith("3|5|6"));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual("u|3|5|6", userList.First().name);
-            }
-            // Contains
-            {
-                var query = userQuery.Where(u => u.name.Contains("|3|5|"));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(3, userList.First().id);
-                Assert.AreEqual("u|3|5|6", userList.First().name);
-            }
-        }
-
-        [TestMethod]
-        public void Test_DbFunction()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-
-            // select * from `User` as t0  where IIF(`t0`.`fatherId` is not null,true, false)
-            {
-                var query = userQuery.Where(u => DbFunction.Call<bool>("IIF", u.fatherId != null, true, false));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(3, userList.Count);
-                Assert.AreEqual(3, userList.Last().id);
-            }
-
-            {
-                var query = userQuery.Where(u => u.birth == DbFunction.Call<DateTime?>("datetime", "2021-01-01 00:00:00", "+2 hours"));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(1, userList.Count);
-                Assert.AreEqual(2, userList.First().id);
-            }
-            {
-                var query = userQuery.Where(u => u.birth == DbFunction.Call<DateTime>("datetime", "2021-01-01 00:00:00", "+" + u.id + " hours"));
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(6, userList.Count);
-                Assert.AreEqual(1, userList.First().id);
-            }
-
-            // coalesce(parameter1,parameter2, …)
-            {
-                var query = userQuery.Where(u => DbFunction.Call<int?>("coalesce", u.fatherId, u.motherId) != null);
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-                Assert.AreEqual(3, userList.Count);
-                Assert.AreEqual(1, userList.First().id);
-            }
-
-
-        }
-
-
-
-        [TestMethod]
-        public void Test_Distinct()
-        {
-            using var dbContext = DataSource.CreateFormatedDbContext(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-            var userQuery = dbContext.Query<User>();
-
-            {
-                var query = userQuery.Select(u => new { u.fatherId }).Distinct();
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(3, userList.Count);
-                Assert.AreEqual(4, userList.First().fatherId);
-                Assert.AreEqual(null, userList.Last().fatherId);
-            }
-            {
-                var query = userQuery.Select(u => u.fatherId).Distinct();
-
-                var sql = query.ToExecuteString();
-                var fatherId = query.FirstOrDefault();
-                Assert.AreEqual(4, fatherId);
-            }
-            {
-                var query = userQuery.Distinct();
-
-                var sql = query.ToExecuteString();
-                var userList = query.ToList();
-
-                Assert.AreEqual(6, userList.Count);
-            }
-
-        }
-
-
-
-
-    }
-}

+ 0 - 133
src/Test/Vit.Orm.Sqlite.MsTest/Transaction_Test.cs

@@ -1,133 +0,0 @@
-
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace Vit.Orm.Sqlite.MsTest
-{
-
-    [TestClass]
-    public class Transaction_Test
-    {
-
-        [TestMethod]
-        public void Test_Transaction()
-        {
-            var dbName = System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_";
-            DataSource.CreateFormatedDbContext(dbName).Dispose();
-
-
-            #region Transaction
-            {
-                using var dbContext = DataSource.CreateDbContext(dbName);
-                var userSet = dbContext.DbSet<User>();
-
-                Assert.AreEqual("u4", userSet.Get(4).name);
-
-                dbContext.Update(new User { id = 4, name = "u41" });
-                Assert.AreEqual("u41", userSet.Get(4).name);
-
-                using (var tran2 = dbContext.BeginTransaction())
-                {
-                    dbContext.Update(new User { id = 4, name = "u42" });
-                    Assert.AreEqual("u42", userSet.Get(4).name);
-                    //tran2.Rollback();
-                }
-
-                Assert.AreEqual("u41", userSet.Get(4).name);
-                using (var tran3 = dbContext.BeginTransaction())
-                {
-                    dbContext.Update(new User { id = 4, name = "u43" });
-                    Assert.AreEqual("u43", userSet.Get(4).name);
-
-                    tran3.Commit();
-                }
-
-                Assert.AreEqual("u43", userSet.Get(4).name);
-            }
-            #endregion
-
-
-            #region Transaction Dispose
-            {
-                {
-                    using var dbContext = DataSource.CreateDbContext(dbName);
-                    var userSet = dbContext.DbSet<User>();
-
-                    var tran2 = dbContext.BeginTransaction();
-                    {
-                        dbContext.Update(new User { id = 4, name = "u42" });
-                        Assert.AreEqual("u42", userSet.Get(4).name);
-                        tran2.Commit();
-                    }
-
-                    Assert.AreEqual("u42", userSet.Get(4).name);
-
-                    var tran3 = dbContext.BeginTransaction();
-                    {
-                        dbContext.Update(new User { id = 4, name = "u43" });
-                        Assert.AreEqual("u43", userSet.Get(4).name);
-                    }
-                    Assert.AreEqual("u43", userSet.Get(4).name);
-                }
-                {
-                    using var dbContext = DataSource.CreateDbContext(dbName);
-                    var userSet = dbContext.DbSet<User>();
-
-                    Assert.AreEqual("u42", userSet.Get(4).name);
-                }
-            }
-            #endregion
-
-
-
-        }
-
-
-
-
-        //[TestMethod]
-        public void Test_NestedTransaction()
-        {
-            var dbName = System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_";
-
-            #region
-            {
-                using var dbContext = DataSource.CreateFormatedDbContext(dbName);
-                var userSet = dbContext.DbSet<User>();
-
-                using (var tran1 = dbContext.BeginTransaction())
-                {
-                    Assert.AreEqual("u4", userSet.Get(4).name);
-
-                    dbContext.Update(new User { id = 4, name = "u41" });
-                    Assert.AreEqual("u41", userSet.Get(4).name);
-
-                    using (var tran2 = dbContext.BeginTransaction())
-                    {
-                        dbContext.Update(new User { id = 4, name = "u42" });
-                        Assert.AreEqual("u42", userSet.Get(4).name);
-                        tran2.Rollback();
-                    }
-
-                    Assert.AreEqual("u41", userSet.Get(4).name);
-                    using (var tran3 = dbContext.BeginTransaction())
-                    {
-                        dbContext.Update(new User { id = 4, name = "u43" });
-                        Assert.AreEqual("u43", userSet.Get(4).name);
-                    }
-
-                    Assert.AreEqual("u43", userSet.Get(4).name);
-                }
-
-                Assert.AreEqual("u43", userSet.Get(4).name);
-            }
-            #endregion
-
-
-
-        }
-
-
-
-
-    }
-}

+ 0 - 24
src/Test/Vit.Orm.Sqlite.MsTest/Vit.Orm.Sqlite.MsTest.csproj

@@ -1,24 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <TargetFramework>net6.0</TargetFramework>
-        <ImplicitUsings>enable</ImplicitUsings>
-        <Nullable>enable</Nullable>
-
-        <IsPackable>false</IsPackable>
-        <IsTestProject>true</IsTestProject>
-    </PropertyGroup>
-
-    <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
-        <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
-        <PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
-
-        <PackageReference Include="Vit.Core" Version="2.1.21" />
-    </ItemGroup>
-
-    <ItemGroup>
-        <ProjectReference Include="..\..\Vit.Orm.Sqlite\Vit.Orm.Sqlite.csproj" />
-    </ItemGroup>
-
-</Project>

+ 0 - 30
src/Vit.Orm.Sqlite/DbContext_Extensions.cs

@@ -1,30 +0,0 @@
-using System;
-using System.Data;
-
-using Vit.Orm.Entity;
-using Vit.Orm.Entity.Dapper;
-using Vit.Orm.Sql;
-using Vit.Orm.Sqlite;
-
-namespace Vit.Extensions
-{
-    public static class DbContext_Extensions
-    {
-        public static SqlDbContext UseSqlite(this SqlDbContext dbContext, string ConnectionString)
-        {
-            ISqlTranslator sqlTranslator = new SqlTranslator(dbContext);
-
-            Func<IDbConnection> createDbConnection = () => new Microsoft.Data.Sqlite.SqliteConnection(ConnectionString);
-
-            Func<Type, IEntityDescriptor> getEntityDescriptor = (type) => EntityDescriptor.GetEntityDescriptor(type);
-
-
-            dbContext.Init(sqlTranslator: sqlTranslator, createDbConnection: createDbConnection, getEntityDescriptor: getEntityDescriptor);
-
-            return dbContext;
-        }
-
-
-
-    }
-}

+ 0 - 354
src/Vit.Orm.Sqlite/Sql/BaseQueryTranslator.cs

@@ -1,354 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Vit.Linq.ExpressionTree.ComponentModel;
-using Vit.Orm.Sql;
-using System.Linq.Expressions;
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-
-namespace Vit.Orm.Sqlite.Sql
-{
-    public abstract class BaseQueryTranslator
-    {
-        public SqlTranslator sqlTranslator { get; protected set; }
-
-
-        public BaseQueryTranslator(SqlTranslator sqlTranslator)
-        {
-            this.sqlTranslator = sqlTranslator;
-        }
-
-
-
-        public IDbDataReader dataReader;
-        public Dictionary<string, object> sqlParam { get; protected set; } = new Dictionary<string, object>();
-
-        protected int paramIndex = 0;
-        protected string NewParamName() => "param" + (paramIndex++);
-
-
-        /// <summary>
-        /// return "*";
-        /// </summary>
-        /// <param name="stream"></param>
-        /// <returns></returns>
-        protected virtual string ReadSelect(CombinedStream stream)
-        {
-            return "*";
-        }
-
-        public virtual string BuildQuery(CombinedStream stream)
-        {
-
-            string sql = "";
-
-            // #0  select
-            sql += "select " + ReadSelect(stream);
-
-
-            #region #1 source
-            // from `User` u
-            sql += "\r\n from " + ReadInnerTable(stream.source);
-            #endregion
-
-            #region #2 join
-            {
-                stream.joins?.ForEach(streamToJoin =>
-                {
-                    sql += "\r\n " + (streamToJoin.joinType == EJoinType.InnerJoin ? "inner join" : "left join");
-                    sql += " " + ReadInnerTable(streamToJoin.right);
-
-                    var where = ReadEval(streamToJoin.on);
-                    if (!string.IsNullOrWhiteSpace(where)) sql += " on " + where;
-                });
-            }
-            #endregion
-
-            // #3 where 1=1
-            if (stream.where != null)
-            {
-                var where = ReadEval(stream.where);
-                if (!string.IsNullOrWhiteSpace(where)) sql += "\r\n where " + where;
-            }
-
-            // #4 GROUP BY xxxx  Having XXX
-            if (stream.isGroupedStream)
-            {
-                #region ##1 group by
-                var node = stream.groupByFields;
-                List<string> fields = new();
-                if (node?.nodeType == NodeType.New)
-                {
-                    ExpressionNode_New newNode = node;
-                    newNode.constructorArgs.ForEach((Action<MemberBind>)(arg =>
-                    {
-                        fields.Add(this.ReadEval((ExpressionNode)arg.value));
-                    }));
-                }
-                else if (node?.nodeType == NodeType.Member)
-                {
-                    fields.Add(ReadEval(node));
-                }
-                else
-                {
-                    throw new NotSupportedException("[QueryTranslator] groupByFields is not valid: must be New or Member");
-                }
-                sql += "\r\n group by " + String.Join(", ", fields);
-                #endregion
-
-                #region ##2 having
-                if (stream.having != null)
-                {
-                    var where = ReadEval(stream.having);
-                    if (!string.IsNullOrWhiteSpace(where)) sql += "\r\n having " + where;
-                }
-                #endregion
-
-            }
-
-            // #5 OrderBy
-            if (stream.orders?.Any() == true)
-            {
-                var fields = stream.orders.Select(field => (sqlTranslator.GetSqlField(field.member) + " " + (field.asc ? "asc" : "desc"))).ToList();
-                sql += "\r\n order by " + String.Join(", ", fields);
-            }
-
-            // #6 limit 1000,10       limit {skip},{take}   |     limit {take}
-            if (stream.take != null || stream.skip != null)
-            {
-                if (stream.skip == null)
-                {
-                    sql += "\r\n limit " + stream.take;
-                }
-                else
-                {
-                    sql += "\r\n limit " + stream.skip + "," + (stream.take ?? 100000000);
-                }
-            }
-
-            return sql;
-        }
-
-        protected string ReadInnerTable(IStream stream)
-        {
-            if (stream is SourceStream sourceStream)
-            {
-                IQueryable query = sourceStream.GetSource() as IQueryable;
-                var tableName = sqlTranslator.GetTableName(query.ElementType);
-                return $"`{tableName}` as " + stream.alias;
-            }
-            if (stream is CombinedStream baseStream)
-            {
-                var innerQuery = BuildQuery(baseStream);
-                return $"({innerQuery}) as " + stream.alias;
-            }
-            throw new NotSupportedException();
-        }
-
-
-
-        /// <summary>
-        /// read where or value or on
-        /// </summary>
-        /// <param name="data"></param>
-        /// <returns></returns>
-        /// <exception cref="NotSupportedException"></exception>
-        protected string ReadEval(ExpressionNode data)
-        {
-            switch (data.nodeType)
-            {
-
-                case NodeType.And:
-                    ExpressionNode_And and = data;
-                    return $"({ReadEval(and.left)}) and ({ReadEval(and.right)})";
-
-                case NodeType.Or:
-                    ExpressionNode_Or or = data;
-                    return $"({ReadEval(or.left)}) or ({ReadEval(or.right)})";
-
-                case NodeType.Not:
-                    ExpressionNode_Not not = data;
-                    return $"not ({ReadEval(not.body)})";
-
-                case NodeType.ArrayIndex:
-                    throw new NotSupportedException(data.nodeType);
-                //ExpressionNode_ArrayIndex arrayIndex = data;
-                //return Expression.ArrayIndex(ToExpression(arg, arrayIndex.left), ToExpression(arg, arrayIndex.right));
-                case NodeType.Equal:
-                case NodeType.NotEqual:
-                    {
-                        ExpressionNode_Binary binary = data;
-
-                        //   "= null"  ->   "is null" ,    "!=null" -> "is not null"   
-                        if (binary.right.nodeType == NodeType.Constant && binary.right.value == null)
-                        {
-                            var opera = data.nodeType == NodeType.Equal ? "is null" : "is not null";
-                            return $"{ReadEval(binary.left)} " + opera;
-                        }
-                        else if (binary.left.nodeType == NodeType.Constant && binary.left.value == null)
-                        {
-                            var opera = data.nodeType == NodeType.Equal ? "is null" : "is not null";
-                            return $"{ReadEval(binary.right)} " + opera;
-                        }
-
-                        var @operator = operatorMap[data.nodeType];
-                        return $"{ReadEval(binary.left)} {@operator} {ReadEval(binary.right)}";
-                    }
-                case NodeType.LessThan:
-                case NodeType.LessThanOrEqual:
-                case NodeType.GreaterThan:
-                case NodeType.GreaterThanOrEqual:
-                    {
-                        ExpressionNode_Binary binary = data;
-                        var @operator = operatorMap[data.nodeType];
-                        return $"{ReadEval(binary.left)} {@operator} {ReadEval(binary.right)}";
-                    }
-                case NodeType.MethodCall:
-                    {
-                        ExpressionNode_MethodCall call = data;
-
-                        switch (call.methodName)
-                        {
-                            case nameof(object.ToString):
-                                {
-                                    return $"cast({ReadEval(call.@object)} as text)";
-                                }
-
-                            #region String method:  StartsWith EndsWith Contains
-                            case nameof(string.StartsWith): // String.StartsWith
-                                {
-                                    var str = call.@object;
-                                    var value = call.arguments[0];
-                                    return $"{ReadEval(str)} like {ReadEval(value)}||'%'";
-                                }
-                            case nameof(string.EndsWith): // String.EndsWith
-                                {
-                                    var str = call.@object;
-                                    var value = call.arguments[0];
-                                    return $"{ReadEval(str)} like '%'||{ReadEval(value)}";
-                                }
-                            case nameof(string.Contains) when call.methodCall_typeName == "String": // String.Contains
-                                {
-                                    var str = call.@object;
-                                    var value = call.arguments[0];
-                                    return $"{ReadEval(str)} like '%'||{ReadEval(value)}||'%'";
-                                }
-                            #endregion
-
-                            case nameof(Enumerable.Contains):
-                                {
-                                    var values = call.arguments[0];
-                                    var member = call.arguments[1];
-                                    return $"{ReadEval(member)} in {ReadEval(values)}";
-                                }
-
-                            case nameof(DbFunction.Call):
-                                {
-                                    var functionName = call.arguments[0].value as string;
-                                    var argList = call.arguments.AsQueryable().Skip(1).Select(arg => ReadEval(arg)).ToList();
-                                    var arg = string.Join(",", argList);
-                                    return $"{functionName}({arg})";
-                                }
-                        }
-                        throw new NotSupportedException("[QueryTranslator] not suported MethodCall: " + call.methodName);
-                    }
-
-
-                #region Read Value
-
-                case NodeType.Member:
-                    return sqlTranslator.GetSqlField(data);
-
-                case NodeType.Constant:
-                    ExpressionNode_Constant constant = data;
-                    var paramName = NewParamName();
-                    sqlParam[paramName] = constant.value;
-                    return "@" + paramName;
-
-                case NodeType.Convert:
-                    {
-                        // cast( 4.1 as signed)
-
-                        ExpressionNode_Convert convert = data;
-
-                        Type targetType = convert.valueType?.ToType();
-
-                        if (targetType == typeof(object)) return ReadEval(convert.body);
-
-                        // Nullable
-                        if (targetType.IsGenericType) targetType = targetType.GetGenericArguments()[0];
-
-                        string targetDbType = GetDbType(targetType);
-
-                        var sourceType = convert.body.Member_GetType();
-                        if (sourceType != null)
-                        {
-                            if (sourceType.IsGenericType) sourceType = sourceType.GetGenericArguments()[0];
-
-                            if (targetDbType == GetDbType(sourceType)) return ReadEval(convert.body);
-                        }
-
-                        if (targetDbType == "datetime")
-                        {
-                            return $"DATETIME({ReadEval(convert.body)})";
-                        }
-                        return $"cast({ReadEval(convert.body)} as {targetDbType})";
-
-                        #region GetDbType
-                        string GetDbType(Type type)
-                        {
-                            if (type == typeof(DateTime))
-                                return "datetime";
-
-                            if (type == typeof(string))
-                                return "text";
-
-                            if (type == typeof(float) || type == typeof(double) || type == typeof(decimal))
-                                return "numeric";
-
-                            if (type == typeof(bool) || type.Name.ToLower().Contains("int")) return "integer";
-
-                            throw new NotSupportedException("[QueryTranslator] unsupported column type:" + type.Name);
-                        }
-                        #endregion
-                    }
-                case nameof(ExpressionType.Add):
-                    {
-                        ExpressionNode_Binary binary = data;
-
-                        // ##1 String Add
-                        if (data.valueType?.ToType() == typeof(string))
-                        {
-                            return $"{ReadEval(binary.left)} || {ReadEval(binary.right)}";
-                        }
-
-                        // ##2 Numberic Add
-                        return $"{ReadEval(binary.left)} + {ReadEval(binary.right)}";
-                    }
-                case nameof(ExpressionType.Coalesce):
-                    {
-                        ExpressionNode_Binary binary = data;
-                        return $"COALESCE({ReadEval(binary.left)},{ReadEval(binary.right)})";
-                    }
-                    #endregion
-            }
-            throw new NotSupportedException("[QueryTranslator] not suported nodeType: " + data.nodeType);
-        }
-
-
-
-
-
-        protected readonly static Dictionary<string, string> operatorMap = new Dictionary<string, string>
-        {
-            [NodeType.Equal] = "=",
-            [NodeType.NotEqual] = "!=",
-            [NodeType.LessThan] = "<",
-            [NodeType.LessThanOrEqual] = "<=",
-            [NodeType.GreaterThan] = ">",
-            [NodeType.GreaterThanOrEqual] = ">=",
-        };
-
-    }
-
-}

+ 0 - 65
src/Vit.Orm.Sqlite/Sql/BatchDeleteTranslator.cs

@@ -1,65 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-using Vit.Orm.Entity;
-
-namespace Vit.Orm.Sqlite.Sql
-{
-    public class BatchDeleteTranslator : BaseQueryTranslator
-    {
-        /*
-WITH tmp AS (
-    select u.id 
-    from `User` u
-    left join `User` father on u.fatherId = father.id 
-    where u.id > 0
-)
-delete from `User` where id in ( SELECT id FROM tmp );
-         */
-        public override string BuildQuery(CombinedStream stream)
-        {
-            var sqlInner = base.BuildQuery(stream);
-
-
-            var NewLine = "\r\n";
-            var keyName = entityDescriptor.keyName;
-            var tableName = entityDescriptor.tableName;
-
-
-            var sql = $"WITH tmp AS ( {NewLine}";
-            sql += sqlInner;
-
-            sql += $"{NewLine}){NewLine}";
-            sql += $"delete from `{tableName}` ";
-
-            sql += $"{NewLine}where `{keyName}` in ( SELECT `{keyName}` FROM tmp ); {NewLine}";
-
-            return sql;
-        }
-
-
-
-        IEntityDescriptor entityDescriptor;
-
-        public BatchDeleteTranslator(SqlTranslator sqlTranslator) : base(sqlTranslator)
-        {
-        }
-
-        protected override string ReadSelect(CombinedStream stream)
-        {
-            var entityType = (stream.source as SourceStream)?.GetEntityType();
-            entityDescriptor = sqlTranslator.GetEntityDescriptor(entityType);
-            if (entityDescriptor == null) throw new ArgumentException("Entity can not be deleted");
-
-            var sqlFields = new List<string>();
-
-            // primary key
-            sqlFields.Add($"{sqlTranslator.GetSqlField(stream.source.alias, entityDescriptor.keyName)} as `{entityDescriptor.keyName}`");
-            return String.Join(",", sqlFields);
-        }
-
-
-
-    }
-}

+ 0 - 90
src/Vit.Orm.Sqlite/Sql/BatchUpdateTranslator.cs

@@ -1,90 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-using Vit.Linq.ExpressionTree.ComponentModel;
-using Vit.Orm.Entity;
-
-namespace Vit.Orm.Sqlite.Sql
-{
-    public class BatchUpdateTranslator : BaseQueryTranslator
-    {
-        /*
-
--- multiple
-WITH tmp AS (
-    select   ('u' || u.id || '_' || COALESCE(father.id,'') ) as `_name` , u.id 
-    from `User` u
-    left join `User` father on u.fatherId = father.id 
-    where u.id > 0
-)
-UPDATE `User`  
-  SET `name` =  ( SELECT `_name` FROM tmp WHERE tmp.id =`User`.id )
-where id in ( SELECT id FROM tmp );
-
-
---- single
-UPDATE `User` SET `name` = 'u'||id  where id > 0;
-         */
-        public override string BuildQuery(CombinedStream stream)
-        {
-            var sqlInner = base.BuildQuery(stream);
-
-
-            var NewLine = "\r\n";
-            var keyName = entityDescriptor.keyName;
-            var tableName = entityDescriptor.tableName;
-
-
-            var sql = $"WITH tmp AS ( {NewLine}";
-            sql += sqlInner;
-
-            sql += $"{NewLine}){NewLine}";
-            sql += $"UPDATE `{tableName}` ";
-
-            var sqlToUpdateCols = columnsToUpdate.Select(m => m.name).Select(name => $"{NewLine}  SET `{name}` =  ( SELECT `_{name}` FROM tmp WHERE tmp.`{keyName}` =`{tableName}`.`{keyName}` )");
-            sql += string.Join(",", sqlToUpdateCols);
-
-            sql += $"{NewLine}where `{keyName}` in ( SELECT `{keyName}` FROM tmp ); {NewLine}";
-
-            return sql;
-        }
-
-
-        List<MemberBind> columnsToUpdate;
-        IEntityDescriptor entityDescriptor;
-
-        public BatchUpdateTranslator(SqlTranslator sqlTranslator) : base(sqlTranslator)
-        {
-        }
-
-        protected override string ReadSelect(CombinedStream stream)
-        {
-            var fieldsToUpdate = (stream as StreamToUpdate)?.fieldsToUpdate;
-
-            columnsToUpdate = (fieldsToUpdate?.constructorArgs ?? new()).AsQueryable().Concat(fieldsToUpdate?.memberArgs ?? new()).ToList();
-            if (columnsToUpdate?.Any() != true) throw new ArgumentException("can not get columns to update");
-
-
-            var entityType = fieldsToUpdate.New_GetType();
-            entityDescriptor = sqlTranslator.GetEntityDescriptor(entityType);
-            if (entityDescriptor == null) throw new ArgumentException("Entity can not be updated");
-
-
-            var sqlFields = new List<string>();
-
-            foreach (var column in columnsToUpdate)
-            {
-                sqlFields.Add($"({ReadEval(column.value)}) as `_{column.name}`");
-            }
-
-            // primary key
-            sqlFields.Add($"{sqlTranslator.GetSqlField(stream.source.alias, entityDescriptor.keyName)} as `{entityDescriptor.keyName}`");
-            return String.Join(",", sqlFields);
-        }
-
-
-
-    }
-}

+ 0 - 131
src/Vit.Orm.Sqlite/Sql/QueryTranslator.cs

@@ -1,131 +0,0 @@
-using System;
-using System.Linq;
-using Vit.Linq.ExpressionTree.ComponentModel;
-using Vit.Orm.DataReader;
-using Vit.Orm.Sql.DataReader;
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-using Vit.Extensions.Linq_Extensions;
-
-
-namespace Vit.Orm.Sqlite.Sql
-{
-    public class QueryTranslator : BaseQueryTranslator
-    {
-        /* //sql
-        select u.id, u.name, u.birth ,u.fatherId ,u.motherId,    father.name,  mother.name
-        from `User` u
-        inner join `User` father on u.fatherId = father.id 
-        left join `User` mother on u.motherId = mother.id
-        where u.id > 1
-        limit 1,5;
-         */
-
-
-
-        /// <summary>
-        /// only used for Method ReadSelect
-        /// </summary>
-        public Type entityType { get; private set; }
-
-        public QueryTranslator(SqlTranslator sqlTranslator, Type entityType) : base(sqlTranslator)
-        {
-            this.entityType = entityType;
-        }
-
-
-        protected override string ReadSelect(CombinedStream stream)
-        {
-            switch (stream.method)
-            {
-                case "Count":
-                    {
-                        var reader = new NumScalarReader();
-                        if (this.dataReader == null) this.dataReader = reader;
-                        return "count(*)";
-                    }
-                case "" or null or "ToList" or nameof(Queryable_Extensions.ToExecuteString):
-                    {
-                        var reader = new EntityReader();
-                        return BuildReader(reader);
-                    }
-                case "FirstOrDefault" or "First" or "LastOrDefault" or "Last":
-                    {
-                        stream.take = 1;
-                        stream.skip = null;
-
-                        if (stream.method.Contains("Last"))
-                            ReverseOrder(stream);
-
-                        var nullable = stream.method.Contains("OrDefault");
-                        var reader = new FirstEntityReader { nullable = nullable };
-                        return BuildReader(reader);
-                    }
-            }
-            throw new NotSupportedException("not supported method: " + stream.method);
-
-
-            #region BuildReader
-            string BuildReader(EntityReader reader)
-            {
-                var resultEntityType = entityType;
-                ExpressionNode selectedFields = stream.select?.fields as ExpressionNode;
-                if (selectedFields == null)
-                {
-                    if (stream.joins?.Any() != true)
-                    {
-                        selectedFields = ExpressionNode.Member(parameterName: stream.source.alias, memberName: null).Member_SetType(resultEntityType);
-                    }
-                }
-
-                if (selectedFields == null)
-                    throw new NotSupportedException("select could not be null");
-
-                if (resultEntityType == null && selectedFields.nodeType == NodeType.New)
-                {
-                    resultEntityType = selectedFields.New_GetType();
-                }
-
-                //if (resultEntityType == null)
-                //    throw new NotSupportedException("resultEntityType could not be null");
-
-                var sqlFields = reader.BuildSelect(resultEntityType, sqlTranslator, sqlTranslator.dbContext.convertService, selectedFields);
-                if (dataReader == null) dataReader = reader;
-                return (stream.distinct == true ? "distinct " : "") + sqlFields;
-            }
-            #endregion
-        }
-        void ReverseOrder(CombinedStream stream)
-        {
-            stream.orders ??= new();
-            var orders = stream.orders;
-            // make sure orders exist
-            if (!orders.Any())
-            {
-                AddOrder(stream.source);
-                stream.joins?.ForEach(right => AddOrder(right.right));
-
-                #region AddOrder
-                void AddOrder(IStream source)
-                {
-                    if (source is SourceStream sourceStream)
-                    {
-                        var entityType = sourceStream.GetEntityType();
-                        var entityDescriptor = sqlTranslator.GetEntityDescriptor(entityType);
-                        if (entityDescriptor != null)
-                        {
-                            var member = ExpressionNode_RenameableMember.Member(stream: source, entityType);
-                            member.memberName = entityDescriptor.keyName;
-                            orders.Add(new OrderField { member = member, asc = true });
-                        }
-                    }
-                }
-                #endregion
-            }
-
-            // reverse order
-            orders?.ForEach(order => order.asc = !order.asc);
-        }
-
-
-    }
-}

+ 0 - 325
src/Vit.Orm.Sqlite/SqlTranslator.cs

@@ -1,325 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-using Vit.Linq.ExpressionTree.ComponentModel;
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-using Vit.Orm.Entity;
-using Vit.Orm.Sql;
-using System.Linq;
-using Vit.Orm.Sqlite.Sql;
-
-namespace Vit.Orm.Sqlite
-{
-    public class SqlTranslator : ISqlTranslator
-    {
-
-        public DbContext dbContext { get; private set; }
-
-        public SqlTranslator(DbContext dbContext)
-        {
-            this.dbContext = dbContext;
-        }
-
-
-        public IEntityDescriptor GetEntityDescriptor(Type entityType) => dbContext.GetEntityDescriptor(entityType);
-
-
-
-        public string PrepareCreate(IEntityDescriptor entityDescriptor)
-        {
-            /* //sql
-CREATE TABLE `user` (
-  `id` int NOT NULL PRIMARY KEY,
-  `name` varchar(100) DEFAULT NULL,
-  `birth` date DEFAULT NULL,
-  `fatherId` int DEFAULT NULL,
-  `motherId` int DEFAULT NULL
-) ;
-              */
-            List<string> sqlFields = new();
-
-            // #1 primary key
-            sqlFields.Add(GetColumnSql(entityDescriptor.key) + " PRIMARY KEY");
-
-            // #2 columns
-            if (entityDescriptor.columns != null)
-            {
-                foreach (var column in entityDescriptor.columns)
-                {
-                    sqlFields.Add(GetColumnSql(column));
-                }
-            }
-
-            return $@"
-CREATE TABLE {DelimitIdentifier(entityDescriptor.tableName)} (
-{string.Join(",\r\n", sqlFields)}
-)";
-
-
-            #region GetColumnSql
-            string GetColumnSql(IColumnDescriptor column)
-            {
-                bool nullable = false;
-
-                var type = column.type;
-                if (type.IsGenericType)
-                {
-                    nullable = true;
-                    type = type.GetGenericArguments()[0];
-                }
-                // name varchar(100) DEFAULT NULL
-                return $"  {DelimitIdentifier(column.name)} {GetDbType(type)} {(nullable ? "DEFAULT NULL" : "NOT NULL")}";
-            }
-            string GetDbType(Type type)
-            {
-                if (type == typeof(DateTime))
-                    return "DATETIME";
-
-                if (type == typeof(string))
-                    return "TEXT";
-
-                if (type == typeof(float) || type == typeof(double) || type == typeof(decimal))
-                    return "REAL";
-
-                if (type == typeof(bool) || type.Name.ToLower().Contains("int")) return "INTEGER";
-
-                throw new NotSupportedException("unsupported column type:" + type.Name);
-            }
-            #endregion
-
-        }
-        public string PrepareGet<Entity>(DbSet<Entity> dbSet)
-        {
-            /* //sql
-            delete from user where id = 7;
-            */
-            var entityDescriptor = dbSet.entityDescriptor;
-
-            // #2 build sql
-            string sql = $@"select * from {DelimitIdentifier(entityDescriptor.tableName)} where {DelimitIdentifier(entityDescriptor.keyName)}={GenerateParameterName(entityDescriptor.keyName)};";
-
-            return sql;
-        }
-
-        public (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) PrepareQuery(CombinedStream combinedStream, Type entityType)
-        {
-            var query = new QueryTranslator(this, entityType: entityType);
-            string sql = query.BuildQuery(combinedStream);
-            return (sql, query.sqlParam, query.dataReader);
-        }
-
-        public (string sql, Dictionary<string, object> sqlParam) PrepareExecuteUpdate(CombinedStream combinedStream)
-        {
-            var query = new BatchUpdateTranslator(this);
-            string sql = query.BuildQuery(combinedStream);
-            return (sql, query.sqlParam);
-        }
-
-        public (string sql, Dictionary<string, object> sqlParam) PrepareExecuteDelete(CombinedStream combinedStream)
-        {
-            var query = new BatchDeleteTranslator(this);
-            string sql = query.BuildQuery(combinedStream);
-            return (sql, query.sqlParam);
-        }
-
-        public (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) PrepareAdd<Entity>(DbSet<Entity> dbSet)
-        {
-            /* //sql
-             insert into user(name,birth,fatherId,motherId) values('','','');
-             select seq from sqlite_sequence where name='user';
-              */
-            var entityDescriptor = dbSet.entityDescriptor;
-
-            // #1 GetSqlParams 
-            Func<Entity, Dictionary<string, object>> GetSqlParams = (entity) =>
-                {
-                    var sqlParam = new Dictionary<string, object>();
-                    foreach (var column in entityDescriptor.allColumns)
-                    {
-                        var columnName = column.name;
-                        var value = column.Get(entity);
-
-                        sqlParam[columnName] = value;
-                    }
-                    return sqlParam;
-                };
-
-            #region #2 columns 
-            List<string> columnNames = new List<string>();
-            List<string> valueParams = new List<string>();
-            string columnName;
-
-            foreach (var column in entityDescriptor.allColumns)
-            {
-                columnName = column.name;
-
-                columnNames.Add( DelimitIdentifier(columnName));
-                valueParams.Add(GenerateParameterName(columnName));
-            }
-            #endregion
-
-            // #3 build sql
-            string sql = $@"insert into {DelimitIdentifier(entityDescriptor.tableName)}({string.Join(",", columnNames)}) values({string.Join(",", valueParams)});";
-            //sql+=$"select seq from sqlite_sequence where name = '{tableName}'; ";
-
-            return (sql, GetSqlParams);
-        }
-
-        public (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) PrepareUpdate<Entity>(DbSet<Entity> dbSet)
-        {
-            /* //sql
-                update user set name='' where id=7;
-            */
-
-            var entityDescriptor = dbSet.entityDescriptor;
-            var sqlParam = new Dictionary<string, object>();
-
-            // #1 GetSqlParams
-            Func<Entity, Dictionary<string, object>> GetSqlParams = (entity) =>
-            {
-                var sqlParam = new Dictionary<string, object>();
-                foreach (var column in entityDescriptor.allColumns)
-                {
-                    var columnName = column.name;
-                    var value = column.Get(entity);
-
-                    sqlParam[columnName] = value;
-                }
-                //sqlParam[entityDescriptor.keyName] = entityDescriptor.key.Get(entity);
-                return sqlParam;
-            };
-
-            // #2 columns
-            List<string> columnsToUpdate = new List<string>();
-            string columnName;
-            foreach (var column in entityDescriptor.columns)
-            {
-                columnName = column.name;
-                columnsToUpdate.Add($"{DelimitIdentifier(columnName)}={GenerateParameterName(columnName)}");
-            }
-
-            // #3 build sql
-            string sql = $@"update {DelimitIdentifier(entityDescriptor.tableName)} set {string.Join(",", columnsToUpdate)} where {DelimitIdentifier(entityDescriptor.keyName)}={GenerateParameterName(entityDescriptor.keyName)};";
-
-            return (sql, GetSqlParams);
-        }
-
-
-        public string PrepareDelete<Entity>(DbSet<Entity> dbSet)
-        {
-            /* //sql
-            delete from user where id = 7;
-            */
-            var entityDescriptor = dbSet.entityDescriptor;
-
-            // #2 build sql
-            string sql = $@"delete from {DelimitIdentifier(entityDescriptor.tableName)} where {DelimitIdentifier(entityDescriptor.keyName)}={GenerateParameterName(entityDescriptor.keyName)};";
-
-            return sql;
-        }
-
-        public string PrepareDeleteRange<Entity>(DbSet<Entity> dbSet)
-        {
-            /* //sql
-            delete from user where id in ( 7 ) ;
-            */
-            var entityDescriptor = dbSet.entityDescriptor;
-
-            // #2 build sql
-            string sql = $@"delete from {DelimitIdentifier(entityDescriptor.tableName)} where {DelimitIdentifier(entityDescriptor.keyName)} in {GenerateParameterName("keys")};";
-
-            return sql;
-        }
-
-        public string GetTableName(Type entityType)
-        {
-            return dbContext.GetEntityDescriptor(entityType)?.tableName;
-        }
-
-
-       
-
-
-        public virtual string GetSqlField(string tableName, string columnName)
-        {
-            return $"{DelimitIdentifier(tableName)}.{DelimitIdentifier(columnName)}";
-        }
-
-
-        public virtual string GetSqlField(ExpressionNode_Member member)
-        {
-            var memberName = member.memberName;
-            if (string.IsNullOrWhiteSpace(memberName))
-            {
-                memberName = dbContext.GetEntityDescriptor(member.Member_GetType())?.keyName;
-            }
-
-            // 1: {"nodeType":"Member","parameterName":"a0","memberName":"id"}
-            // 2: {"nodeType":"Member","objectValue":{"parameterName":"a0","nodeType":"Member"},"memberName":"id"}
-            return GetSqlField(member.objectValue?.parameterName ?? member.parameterName, memberName);
-        }
-
-
-        /// <summary>
-        /// functionName example:  Count, Max, Min, Sum, Average
-        /// </summary>
-        /// <param name="functionName"></param>
-        /// <param name="tableName"></param>
-        /// <param name="columnName"></param>
-        /// <returns></returns>
-        public string GetSqlField_Aggregate(string functionName, string tableName, string columnName)
-        {
-            switch (functionName)
-            {
-                case nameof(Enumerable.Count):
-                    {
-                        if (columnName == null) return $"{functionName}(*)";
-                        return $"{functionName}({GetSqlField(tableName, columnName)})";
-                    }
-                case nameof(Enumerable.Max) or nameof(Enumerable.Min) or nameof(Enumerable.Sum):
-                    {
-                        return $"{functionName}({GetSqlField(tableName, columnName)})";
-                    }
-                case nameof(Enumerable.Average):
-                    {
-                        return $"AVG({GetSqlField(tableName, columnName)})";
-                    }
-            }
-            throw new NotSupportedException("[SqlTranslator] unsupported aggregate function : " + functionName);
-        }
-
-
-    
-
-
-
-        #region DelimitIdentifier
-        /// <summary>
-        ///     Generates the delimited SQL representation of an identifier (column name, table name, etc.).
-        /// </summary>
-        /// <param name="identifier">The identifier to delimit.</param>
-        /// <returns>
-        ///     The generated string.
-        /// </returns>
-        public virtual string DelimitIdentifier(string identifier) => $"\"{EscapeIdentifier(identifier)}\""; // Interpolation okay; strings
-
-        /// <summary>
-        ///     Generates the escaped SQL representation of an identifier (column name, table name, etc.).
-        /// </summary>
-        /// <param name="identifier">The identifier to be escaped.</param>
-        /// <returns>
-        ///     The generated string.
-        /// </returns>
-        public virtual string EscapeIdentifier(string identifier) => identifier.Replace("\"", "\"\"");
-
-        /// <summary>
-        ///     Generates a valid parameter name for the given candidate name.
-        /// </summary>
-        /// <param name="name">The candidate name for the parameter.</param>
-        /// <returns>
-        ///     A valid name based on the candidate name.
-        /// </returns>
-        public virtual string GenerateParameterName(string name) => name.StartsWith("@", StringComparison.Ordinal) ? name : "@" + name;
-        #endregion
-    }
-}

+ 0 - 21
src/Vit.Orm.Sqlite/Vit.Orm.Sqlite.csproj

@@ -1,21 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <pack>nuget</pack>
-    </PropertyGroup>
-
-    <PropertyGroup>
-        <TargetFramework>netstandard2.0</TargetFramework>
-        <Version>2.2.22-temp</Version>
-        <LangVersion>9.0</LangVersion>
-    </PropertyGroup>
-
-    <ItemGroup>
-        <PackageReference Include="Microsoft.Data.Sqlite" Version="5.0.17" />
-    </ItemGroup>
-
-    <ItemGroup>
-        <ProjectReference Include="..\Vit.Orm\Vit.Orm.csproj" />
-    </ItemGroup>
-
-</Project>

+ 0 - 72
src/Vit.Orm/DbContext.cs

@@ -1,72 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-
-using Vit.Linq.ExpressionTree;
-using Vit.Orm.Entity;
-
-namespace Vit.Orm
-{
-    public class DbContext : IDisposable
-    {
-        public DbContext() { }
-
-        public virtual ExpressionConvertService convertService => ExpressionConvertService.Instance;
-
-        public Func<Type, IDbSet> dbSetCreator { set; protected get; }
-
-        Dictionary<Type, IDbSet> dbSetMap = new();
-
-        public virtual IDbSet DbSet(Type entityType)
-        {
-            if (dbSetMap.TryGetValue(entityType, out var dbSet)) return dbSet;
-
-            dbSet = dbSetCreator(entityType);
-            dbSetMap[entityType] = dbSet;
-            return dbSet;
-
-            //return dbSetMap.GetOrAdd(entityType, dbSetCreator);
-        }
-        public virtual DbSet<Entity> DbSet<Entity>()
-        {
-            return DbSet(typeof(Entity)) as DbSet<Entity>;
-        }
-
-
-        public virtual IEntityDescriptor GetEntityDescriptor(Type entityType) => DbSet(entityType)?.entityDescriptor;
-
-
-
-        public virtual void Create<Entity>() => DbSet<Entity>().Create();
-
-        public virtual Entity Add<Entity>(Entity entity) => DbSet<Entity>().Add(entity);
-        public virtual void AddRange<Entity>(IEnumerable<Entity> entitys) => DbSet<Entity>().AddRange(entitys);
-
-
-        public virtual Entity Get<Entity>(object keyValue) => DbSet<Entity>().Get(keyValue);
-        public virtual IQueryable<Entity> Query<Entity>() => DbSet<Entity>().Query();
-
-
-
-        public virtual int Update<Entity>(Entity entity) => DbSet<Entity>().Update(entity);
-        public virtual int UpdateRange<Entity>(IEnumerable<Entity> entitys) => DbSet<Entity>().UpdateRange(entitys);
-
-
-
-        public virtual int Delete<Entity>(Entity entity) => DbSet<Entity>().Delete(entity);
-        public virtual int DeleteRange<Entity>(IEnumerable<Entity> entitys) => DbSet<Entity>().DeleteRange(entitys);
-
-
-        public virtual int DeleteByKey<Entity>(object keyValue) => DbSet<Entity>().DeleteByKey(keyValue);
-        public virtual int DeleteByKeys<Entity, Key>(IEnumerable<Key> keys) => DbSet<Entity>().DeleteByKeys(keys);
-
-        public virtual IDbTransaction BeginTransaction()
-        {
-            throw new NotImplementedException();
-        }
-        public virtual void Dispose()
-        {
-        }
-    }
-}

+ 0 - 43
src/Vit.Orm/DbSet.cs

@@ -1,43 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-
-using Vit.Orm.Entity;
-
-namespace Vit.Orm
-{
-    public interface IDbSet
-    {
-        IEntityDescriptor entityDescriptor { get; }
-    }
-
-    public abstract class DbSet<Entity> : IDbSet
-    {
-        public abstract IEntityDescriptor entityDescriptor { get; }
-
-
-        public abstract void Create();
-
-
-        public abstract Entity Add(Entity entity);
-        public abstract void AddRange(IEnumerable<Entity> entitys);
-
-
-        public abstract Entity Get(object keyValue);
-        public abstract IQueryable<Entity> Query();
-
-
-
-        public abstract int Update(Entity entity);
-        public abstract int UpdateRange(IEnumerable<Entity> entitys);
-
-
-        public abstract int Delete(Entity entity);
-        public abstract int DeleteRange(IEnumerable<Entity> entitys);
-
-        public abstract int DeleteByKey(object keyValue);
-        public abstract int DeleteByKeys<Key>(IEnumerable<Key> keys);
-
-
-
-    }
-}

+ 0 - 31
src/Vit.Orm/Entity/ColumnDescriptor.cs

@@ -1,31 +0,0 @@
-using System;
-using System.Reflection;
-
-namespace Vit.Orm.Entity
-{
-    public class ColumnDescriptor : IColumnDescriptor
-    {
-        public ColumnDescriptor(PropertyInfo propertyInfo, bool isPrimaryKey)
-        {
-            this.propertyInfo = propertyInfo;
-            this.isPrimaryKey = isPrimaryKey;
-        }
-
-        PropertyInfo propertyInfo;
-        public bool isPrimaryKey { get; private set; }
-        public string name => propertyInfo?.Name;
-
-        public Type type => propertyInfo?.PropertyType;
-
-        public void Set(object entity, object value)
-        {
-            propertyInfo?.SetValue(entity, value);
-        }
-        public object Get(object entity)
-        {
-            return propertyInfo?.GetValue(entity, null);
-        }
-    }
-
-
-}

+ 0 - 64
src/Vit.Orm/Entity/Dapper/EntityDescriptor.cs

@@ -1,64 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-
-namespace Vit.Orm.Entity.Dapper
-{
-    public class EntityDescriptor : IEntityDescriptor
-    {
-        static ConcurrentDictionary<Type, EntityDescriptor> descMap = new();
-        static EntityDescriptor New(Type entityType) => new EntityDescriptor(entityType);
-
-        public static string GetTableName(Type entityType) => entityType?.GetCustomAttribute<global::Dapper.Contrib.Extensions.TableAttribute>()?.Name;
-        public static EntityDescriptor GetEntityDescriptor(Type entityType)
-        {
-            if (GetTableName(entityType) == null) return null;
-
-            return descMap.GetOrAdd(entityType, New);
-        }
-
-        public static EntityDescriptor GetEntityDescriptor<Entity>()
-        {
-            return GetEntityDescriptor(typeof(Entity));
-        }
-
-        EntityDescriptor(Type entityType)
-        {
-            tableName = GetTableName(entityType);
-
-            var entityProperties = entityType?.GetProperties(BindingFlags.Public | BindingFlags.Instance) ?? new PropertyInfo[0];
-
-            var keyProperty = entityProperties.FirstOrDefault(p => p.GetCustomAttribute<global::Dapper.Contrib.Extensions.KeyAttribute>() != null);
-            this.key = new ColumnDescriptor(keyProperty, true);
-
-            var properties = entityProperties.Where(p => p.GetCustomAttribute<global::Dapper.Contrib.Extensions.KeyAttribute>() == null);
-            this.columns = properties.Select(p => new ColumnDescriptor(p, false)).ToArray();
-
-            allColumns = new List<IColumnDescriptor> { key }.Concat(columns).ToArray();
-        }
-
-        public string tableName { get; private set; }
-
-        /// <summary>
-        /// primary key name
-        /// </summary>
-        public string keyName => key?.name;
-
-        /// <summary>
-        /// primary key
-        /// </summary>
-        public IColumnDescriptor key { get; private set; }
-
-        /// <summary>
-        /// not include primary key
-        /// </summary>
-        public IColumnDescriptor[] columns { get; private set; }
-
-
-        public IColumnDescriptor[] allColumns { get; private set; }
-
-
-    }
-}

+ 0 - 13
src/Vit.Orm/Entity/IColumnDescriptor.cs

@@ -1,13 +0,0 @@
-using System;
-
-namespace Vit.Orm.Entity
-{
-    public interface IColumnDescriptor
-    {
-        bool isPrimaryKey { get; }
-        string name { get; }
-        Type type { get; }
-        void Set(object entity, object value);
-        object Get(object entity);
-    }
-}

+ 0 - 19
src/Vit.Orm/Entity/IEntityDescriptor.cs

@@ -1,19 +0,0 @@
-namespace Vit.Orm.Entity
-{
-    public interface IEntityDescriptor
-    {
-        string tableName { get; }
-        string keyName { get; }
-        /// <summary>
-        /// primary key
-        /// </summary>
-        public IColumnDescriptor key { get; }
-
-        /// <summary>
-        /// not include primary key
-        /// </summary>
-        public IColumnDescriptor[] columns { get; }
-
-        public IColumnDescriptor[] allColumns { get; }
-    }
-}

+ 0 - 106
src/Vit.Orm/README.md

@@ -1,106 +0,0 @@
-
-complex-query-operators https://learn.microsoft.com/en-us/ef/core/querying/complex-query-operators
-sqlite/transactions  https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/transactions
-
---------------
-# cur
-
-# support Mysql
-
-
-
-# sqlite upgrade to latest version
-# remove depency of Dapper
-# try to make it clean
-
-
-# support SqlServer
-# support ElasticSearch
-# support ClickHouse
-
-
-# DbContext.QueryProcedure<Entity>(arg)
-
---------------
-# TODO
-
-# sqlite nested transaction
-# Save SaveRange
-
-
-
-#region #4 cross database join
-{
-    var dbContext = DataSource.BuildInitedDatabase(System.Reflection.MethodBase.GetCurrentMethod()?.Name ?? "_");
-    var users2 = dbContext.Query<User>();
-
-    var query = (from user in users
-                from father in users2.Where(father => user.fatherId == father.id).DefaultIfEmpty()
-                select new
-                {
-                    user,
-                    father
-                });  
-
-    var userList = query.ToList();
-    Assert.AreEqual(4, userList.Count);
-    Assert.AreEqual(3, userList.First().user.id);
-}
-#endregion
-
-##   where (`t0`.`id` + 1 = 4) and (`t0`.`fatherId` = cast(5 as integer))
-
-# will cause column mismatch if using inner select like:
-select `t2`.`id`,`t2`.`name`,`t2`.`birth`,`t2`.`fatherId`,`t2`.`motherId`,`t3`.`name`
- from 
- (
-	 select `t0`.`id`,`t0`.`name`,`t0`.`birth`,`t0`.`fatherId`,`t0`.`motherId`,`t1`.`id`,`t1`.`name`,`t1`.`birth`,`t1`.`fatherId`,`t1`.`motherId`
-	 from `User` as t0
-	 left join `User` as t1 on `t0`.`fatherId` = `t1`.`id`
- ) as t2
- left join `User` as t3 on `t2`.`motherId` = `t3`.`id`
-
---------------
-# done
-
-
-## sql Func
-## sql like
-# join with Queryable.Join or GroupJoin
-
-# GroupBy
-
-# distinct
-# sql Contains
-
-# Add AddRange
-# Get(keyValue)
-# Update UpdateRange
-# ExecuteDelete
-# DeleteByKey DeleteByKeys
-# Delete DeleteRange
-
-
-## ToArray First FirstOrDefault Last LastOrDefault
-
-## ExecuteUpdate
-## sql calc:      set name = a.name + '22' 
-## sql calc:      where a.name + '22' = 'lith22'
-
-## Insert
-## Update
-## Delete
-
- 
-
-## remove nullable convert in sql
-## limit (Take Skip)
-## OrderBy
-## Count
-## select return null entity if not exist
-
-## left join
-
-## where
- "= null"  ->   "is null" ,    "!=null" -> "is not null"   
-  is null , check by primary key

+ 0 - 191
src/Vit.Orm/Sql/DataReader/EntityReader.cs

@@ -1,191 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using System.Reflection;
-
-using Vit.Linq.ExpressionTree;
-using Vit.Linq.ExpressionTree.ComponentModel;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    public class EntityReader : IDbDataReader
-    {
-        public List<string> sqlFields { get; private set; } = new List<string>();
-
-        protected Type entityType;
-        protected List<IArgReader> entityArgReaders = new List<IArgReader>();
-        protected Delegate lambdaCreateEntity;
-
-        public string BuildSelect(Type entityType, ISqlTranslator sqlTranslator, ExpressionConvertService convertService, ExpressionNode selectedFields)
-        {
-            this.entityType = entityType;
-
-            var cloner = new ExpressionNodeCloner();
-            cloner.clone = (node) =>
-            {
-                if (node?.nodeType == NodeType.Member)
-                {
-                    ExpressionNode_Member member = node;
-
-                    var argName = GetArgument(sqlTranslator, member);
-
-                    if (argName != null)
-                    {
-                        return (true, ExpressionNode.Member(parameterName: argName, memberName: null));
-                    }
-                }
-                else if (node?.nodeType == NodeType.MethodCall)
-                {
-                    ExpressionNode_MethodCall methodCall = node;
-
-                    var argName = GetArgument(sqlTranslator, methodCall);
-
-                    if (argName != null)
-                    {
-                        return (true, ExpressionNode.Member(parameterName: argName, memberName: null));
-                    }
-                }
-                return default;
-            };
-            ExpressionNode_New newExp = cloner.Clone(selectedFields);
-
-
-            #region Compile Lambda
-            var lambdaNode = ExpressionNode.Lambda(entityArgReaders.Select(m => m.argName).ToArray(), (ExpressionNode)newExp);
-            //var strNode = Json.Serialize(lambdaNode);
-
-            var lambdaExp = convertService.ToLambdaExpression(lambdaNode, entityArgReaders.Select(m => m.argType).ToArray());
-
-            lambdaCreateEntity = lambdaExp.Compile();
-            #endregion
-
-            // sqlFields
-            return String.Join(", ", sqlFields);
-        }
-
-
-        public virtual object ReadData(IDataReader reader)
-        {
-            return new Func<IDataReader, object>(ReadEntity<string>)
-              .GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(entityType)
-              .Invoke(this, new object[] { reader });
-        }
-
-        object ReadEntity<Entity>(IDataReader reader)
-        {
-            var list = new List<Entity>();
-
-            while (reader.Read())
-            {
-                var lambdaArgs = entityArgReaders.Select(m => m.Read(reader)).ToArray();
-                var obj = (Entity)lambdaCreateEntity.DynamicInvoke(lambdaArgs);
-                list.Add(obj);
-            }
-
-            return list;
-        }
-
-        protected string GetArgument(ISqlTranslator sqlTranslator, ExpressionNode_Member member)
-        {
-            // tableName_fieldName   tableName_
-            var argUniqueKey = $"arg_{member.objectValue?.parameterName ?? member.parameterName}_{member.memberName}";
-
-            IArgReader argReader = entityArgReaders.FirstOrDefault(reader => reader.argUniqueKey == argUniqueKey);
-
-            if (argReader == null)
-            {
-                var argName = "arg_" + entityArgReaders.Count;
-
-                var argType = member.Member_GetType();
-
-                bool isValueType = TypeUtil.IsValueType(argType);
-                if (isValueType)
-                {
-                    // Value arg
-                    string sqlFieldName = sqlTranslator.GetSqlField(member);
-                    argReader = new ValueReader(this, argType, argUniqueKey, argName, sqlFieldName);
-                }
-                else
-                {
-                    // Entity arg
-                    argReader = new ModelReader(this, sqlTranslator, member, argUniqueKey, argName, argType);
-                }
-                entityArgReaders.Add(argReader);
-            }
-            return argReader.argName;
-        }
-        protected string GetArgument(ISqlTranslator sqlTranslator, ExpressionNode_MethodCall methodCall)
-        {
-            var functionName = methodCall.methodName;
-            switch (methodCall.methodName)
-            {
-                case nameof(Enumerable.Count):
-                    {
-                        var stream = methodCall.arguments[0] as ExpressionNode_Member;
-                        if (stream?.nodeType == NodeType.Member && stream.parameterName != null && stream.memberName == null)
-                        {
-                            var tableName = stream.parameterName;
-                            var columnName = stream.memberName;
-
-                            var argUniqueKey = $"argFunc_{functionName}_{tableName}_{columnName}";
-
-                            IArgReader argReader = entityArgReaders.FirstOrDefault(reader => reader.argUniqueKey == argUniqueKey);
-
-                            if (argReader == null)
-                            {
-                                var argName = "arg_" + entityArgReaders.Count;
-
-                                var argType = typeof(int);
-
-                                // Value arg
-                                string sqlFieldName = sqlTranslator.GetSqlField_Aggregate(functionName,tableName, columnName: columnName);
-                                argReader = new ValueReader(this, argType, argUniqueKey, argName, sqlFieldName);
-
-                                entityArgReaders.Add(argReader);
-                            }
-                            return argReader.argName;
-                        }
-                    }
-                    break;
-                case nameof(Enumerable.Max) or nameof(Enumerable.Min) or nameof(Enumerable.Sum) or nameof(Enumerable.Average) when methodCall.arguments.Length == 2:
-                    {
-                        var stream = methodCall.arguments[0] as ExpressionNode_Member;
-                        if (stream?.nodeType == NodeType.Member && stream.parameterName != null && stream.memberName == null)
-                        {
-                            var lambdaFieldSelect = methodCall.arguments[1] as ExpressionNode_Lambda;
-                            if (lambdaFieldSelect?.body?.nodeType == NodeType.Member)
-                            {
-                                var tableName = stream.parameterName;
-                                string columnName = lambdaFieldSelect.body.memberName;
-
-                                var argUniqueKey = $"argFunc_{functionName}_{tableName}_{columnName}";
-
-                                IArgReader argReader = entityArgReaders.FirstOrDefault(reader => reader.argUniqueKey == argUniqueKey);
-
-                                if (argReader == null)
-                                {
-                                    var argName = "arg_" + entityArgReaders.Count;
-
-                                    var argType = methodCall.MethodCall_GetReturnType();
-
-                                    // Value arg
-                                    string sqlFieldName = sqlTranslator.GetSqlField_Aggregate(functionName,tableName, columnName: columnName);
-                                    argReader = new ValueReader(this, argType, argUniqueKey, argName, sqlFieldName);
-
-                                    entityArgReaders.Add(argReader);
-                                }
-                                return argReader.argName;
-                            }
-                        }
-                    }
-                    break;
-
-            }
-            //throw new NotSupportedException("[CollectionStream] unexpected method call : " + methodCall.methodName);
-            return default;
-        }
-
-
-    }
-}

+ 0 - 14
src/Vit.Orm/Sql/DataReader/EntityReader/IArgReader.cs

@@ -1,14 +0,0 @@
-using System;
-using System.Data;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    public interface IArgReader
-    {
-        string argUniqueKey { get; }
-        Type argType { get; }
-        string argName { get; }
-        object Read(IDataReader reader);
-    }
-
-}

+ 0 - 35
src/Vit.Orm/Sql/DataReader/EntityReader/ModelReader.EntityPropertyReader.cs

@@ -1,35 +0,0 @@
-using System.Data;
-
-using Vit.Orm.Entity;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    partial class ModelReader
-    {
-        class EntityPropertyReader : SqlFieldReader
-        {
-            IColumnDescriptor column;
-
-            public EntityPropertyReader(EntityReader entityReader, IColumnDescriptor column, bool isPrimaryKey, string sqlFieldName)
-                : base(entityReader.sqlFields, column.type, sqlFieldName)
-            {
-                this.column = column;
-            }
-            public bool Read(IDataReader reader, object entity)
-            {
-                var value = Read(reader);
-                if (value != null)
-                {
-                    column.Set(entity, value);
-                    return true;
-                }
-
-                if (column.isPrimaryKey) return false;
-                return true;
-            }
-        }
-    }
-
-
-
-}

+ 0 - 54
src/Vit.Orm/Sql/DataReader/EntityReader/ModelReader.cs

@@ -1,54 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Data;
-
-using Vit.Linq.ExpressionTree.ComponentModel;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    partial class ModelReader : IArgReader
-    {
-        public string argName { get; set; }
-        public string argUniqueKey { get; set; }
-        public Type argType { get; set; }
-
-        List<EntityPropertyReader> proppertyReaders = new();
-
-        public ModelReader(EntityReader entityReader, ISqlTranslator sqlTranslator, ExpressionNode_Member member, string argUniqueKey, string argName, Type argType)
-        {
-            this.argUniqueKey = argUniqueKey;
-            this.argName = argName;
-            this.argType = argType;
-
-            var entityDescriptor = sqlTranslator.GetEntityDescriptor(argType);
-
-            // 1: {"nodeType":"Member","parameterName":"a0","memberName":"id"}
-            // 2: {"nodeType":"Member","objectValue":{"parameterName":"a0","nodeType":"Member"},"memberName":"id"}
-            var tableName = member.objectValue?.parameterName ?? member.parameterName;
-
-            // ##1 key
-            string sqlFieldName = sqlTranslator.GetSqlField(tableName, entityDescriptor.keyName);
-            proppertyReaders.Add(new EntityPropertyReader(entityReader, entityDescriptor.key, true, sqlFieldName));
-
-            // ##2 properties
-            foreach (var column in entityDescriptor.columns)
-            {
-                sqlFieldName = sqlTranslator.GetSqlField(tableName, column.name);
-                proppertyReaders.Add(new EntityPropertyReader(entityReader, column, false, sqlFieldName));
-            }
-        }
-        public object Read(IDataReader reader)
-        {
-            var entity = Activator.CreateInstance(argType);
-            foreach (var perpertyReader in proppertyReaders)
-            {
-                if (!perpertyReader.Read(reader, entity))
-                    return null;
-            }
-            return entity;
-        }
-    }
-
-
-
-}

+ 0 - 41
src/Vit.Orm/Sql/DataReader/EntityReader/SqlFieldReader.cs

@@ -1,41 +0,0 @@
-using System;
-using System.Data;
-using System.Collections.Generic;
-
-namespace Vit.Orm.Sql.DataReader
-{
-
-    class SqlFieldReader
-    {
-        public int sqlFieldIndex { get; set; }
-        protected Type valueType { get; set; }
-        protected Type underlyingType;
-
-
-        public SqlFieldReader(List<string> sqlFields, Type valueType, string sqlFieldName)
-        {
-            this.valueType = valueType;
-            underlyingType = TypeUtil.GetUnderlyingType(valueType);
-
-            sqlFieldIndex = sqlFields.IndexOf(sqlFieldName);
-            if (sqlFieldIndex < 0)
-            {
-                sqlFieldIndex = sqlFields.Count;
-                sqlFields.Add(sqlFieldName);
-            }
-        }
-
-
-
-        public object Read(IDataReader reader)
-        {
-            var value = reader.GetValue(sqlFieldIndex);
-            return TypeUtil.ConvertToUnderlyingType(value, underlyingType);
-        }
-
-
-    }
-
-
-
-}

+ 0 - 51
src/Vit.Orm/Sql/DataReader/EntityReader/TypeUtil.cs

@@ -1,51 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    public class TypeUtil
-    {
-        public static Type GetUnderlyingType(Type type)
-        {
-            if (type.IsGenericType && typeof(Nullable<>) == type.GetGenericTypeDefinition())
-            {
-                return type.GetGenericArguments()[0];
-            }
-            return type;
-        }
-
-        /// <summary>
-        /// is ValueType or string or Nullable
-        /// </summary>
-        /// <param name="type"></param>
-        /// <returns></returns>
-        public static bool IsValueType(Type type)
-        {
-            if (type.IsValueType || type == typeof(string)) return true;
-            if (type.IsGenericType && typeof(Nullable<>) == type.GetGenericTypeDefinition())
-            {
-                return true;
-            }
-            return false;
-        }
-
-
-
-        public static object ConvertToType(object value, Type type)
-        {
-            return ConvertToUnderlyingType(value, GetUnderlyingType(type));
-        }
-
-        public static object ConvertToUnderlyingType(object value, Type underlyingType)
-        {
-            if (value == null || value == DBNull.Value) return null;
-
-            if (!underlyingType.IsInstanceOfType(value))
-                value = Convert.ChangeType(value, underlyingType);
-            return value;
-        }
-
-
-    }
-}

+ 0 - 25
src/Vit.Orm/Sql/DataReader/EntityReader/ValueReader.cs

@@ -1,25 +0,0 @@
-using System;
-
-using Vit.Linq.ExpressionTree.ComponentModel;
-
-namespace Vit.Orm.Sql.DataReader
-{
-
-    class ValueReader : SqlFieldReader, IArgReader
-    {
-        public string argName { get; set; }
-
-        public string argUniqueKey { get; set; }
-
-        public Type argType { get => valueType; }
-
-        public ValueReader(EntityReader entityReader, Type valueType, string argUniqueKey, string argName, string sqlFieldName)
-                     : base(entityReader.sqlFields, valueType, sqlFieldName)
-        {
-            this.argUniqueKey = argUniqueKey;
-            this.argName = argName;
-        }
-    }
-
-
-}

+ 0 - 32
src/Vit.Orm/Sql/DataReader/FirstEntityReader.cs

@@ -1,32 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-
-namespace Vit.Orm.Sql.DataReader
-{
-    public class FirstEntityReader: EntityReader
-    {
-        public bool nullable = true;
-        public override object ReadData(IDataReader reader)
-        {
-            return new Func<IDataReader, string>(ReadEntity<string>)
-              .GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(entityType)
-              .Invoke(this, new object[] { reader });
-        }
-
-        Entity ReadEntity<Entity>(IDataReader reader)
-        {
-            if (reader.Read())
-            {
-                var lambdaArgs = entityArgReaders.Select(m => m.Read(reader)).ToArray();
-                var obj = (Entity)lambdaCreateEntity.DynamicInvoke(lambdaArgs);
-                return obj;
-            }
-            if (!nullable) throw new InvalidOperationException("Sequence contains no elements");
-            return default;
-        }
-    }
-}

+ 0 - 20
src/Vit.Orm/Sql/DataReader/NumScalarReader.cs

@@ -1,20 +0,0 @@
-using System;
-using System.Data;
-
-using Vit.Orm.Sql;
-
-namespace Vit.Orm.DataReader
-{
-    public class NumScalarReader : IDbDataReader
-    {
-        public object ReadData(IDataReader reader)
-        {
-            if (reader.Read())
-            {
-                var count = reader.GetValue(0);
-                return Convert.ToInt32(count);
-            }
-            return -1;
-        }
-    }
-}

+ 0 - 9
src/Vit.Orm/Sql/IDbDataReader.cs

@@ -1,9 +0,0 @@
- 
-
-namespace Vit.Orm.Sql
-{
-    public interface IDbDataReader
-    {
-        object ReadData(System.Data.IDataReader reader);
-    }
-}

+ 0 - 46
src/Vit.Orm/Sql/ISqlTranslator.cs

@@ -1,46 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-using Vit.Linq.ExpressionTree.ComponentModel;
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-using Vit.Orm.Entity;
-
-namespace Vit.Orm.Sql
-{
-    public interface ISqlTranslator
-    {
-        string PrepareCreate(IEntityDescriptor entityDescriptor);
-
-        string PrepareGet<Entity>(DbSet<Entity> dbSet);
-
-        (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) PrepareQuery(CombinedStream combinedStream, Type entityType);
-
-
-        (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) PrepareAdd<Entity>(DbSet<Entity> dbSet);
-
-
-        (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) PrepareUpdate<Entity>(DbSet<Entity> dbSet);
-        (string sql, Dictionary<string, object> sqlParam) PrepareExecuteUpdate(CombinedStream combinedStream);
-
-        string PrepareDelete<Entity>(DbSet<Entity> dbSet);
-
-        string PrepareDeleteRange<Entity>(DbSet<Entity> dbSet);
-
-        (string sql, Dictionary<string, object> sqlParam) PrepareExecuteDelete(CombinedStream combinedStream);
-
-
-        string GetTableName(Type entityType);
-        string GetSqlField(string tableName, string columnName);
-        string GetSqlField(ExpressionNode_Member member);
-
-        /// <summary>
-        /// functionName example:  Count, Max, Min, Sum, Average
-        /// </summary>
-        /// <param name="functionName"></param>
-        /// <param name="tableName"></param>
-        /// <param name="columnName"></param>
-        /// <returns></returns>
-        string GetSqlField_Aggregate(string functionName, string tableName, string columnName);
-        IEntityDescriptor GetEntityDescriptor(Type entityType);
-    }
-}

+ 0 - 148
src/Vit.Orm/Sql/SqlDbContext.cs

@@ -1,148 +0,0 @@
-using Dapper;
-
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Data.Common;
-
-using Vit.Orm.Entity;
-
-namespace Vit.Orm.Sql
-{
-    public class SqlDbContext : DbContext
-    {
-        protected Func<IDbConnection> createDbConnection { get; set; }
-        protected IDbConnection _dbConnection;
-        public override void Dispose()
-        {
-            base.Dispose();
-
-            // dispose transactions
-            DisposeTransactions();
-
-            _dbConnection?.Dispose();
-            _dbConnection = null;
-        }
-        public virtual IDbConnection dbConnection => _dbConnection ??= createDbConnection();
-
-
-        public ISqlTranslator sqlTranslator { get; private set; }
-
-
-        public void Init(ISqlTranslator sqlTranslator, Func<IDbConnection> createDbConnection, Func<Type, IEntityDescriptor> getEntityDescriptor)
-        {
-            this.sqlTranslator = sqlTranslator;
-            this.createDbConnection = createDbConnection;
-
-            this.dbSetCreator = (entityType) =>
-            {
-                var entityDescriptor = getEntityDescriptor(entityType);
-                return SqlDbSetConstructor.CreateDbSet(this, entityType, entityDescriptor);
-            };
-        }
-
-        protected Stack<TransactionWrap> transactions;
-        protected IDbTransaction GetCurrentTransaction()
-        {
-            if (transactions == null) return null;
-
-            while (transactions.Count > 0)
-            {
-                var tran = transactions.Peek();
-                if (tran?.TransactionState == TransactionWrap.ETransactionState.Active) return tran.originalTransaction;
-                transactions.Pop();
-            }
-            return null;
-        }
-        protected void DisposeTransactions()
-        {
-            if (transactions == null) return;
-
-            while (transactions.Count > 0)
-            {
-                var transaction = transactions.Pop();
-                if (transaction?.TransactionState != TransactionWrap.ETransactionState.Disposed)
-                {
-                    transaction?.Dispose();
-                }
-            }
-            transactions = null;
-        }
-        public override IDbTransaction BeginTransaction()
-        {
-            if (dbConnection.State != ConnectionState.Open) dbConnection.Open();
-
-            var transaction = dbConnection.BeginTransaction();
-
-            transactions ??= new();
-            var wrap = new TransactionWrap(transaction);
-            transactions.Push(wrap);
-            return wrap;
-        }
-
-        public class TransactionWrap : IDbTransaction
-        {
-            public enum ETransactionState
-            {
-                Active, Committed, RolledBack, Disposed
-            }
-            public ETransactionState TransactionState { get; private set; } = ETransactionState.Active;
-            public TransactionWrap(IDbTransaction transaction)
-            {
-                originalTransaction = transaction;
-            }
-            public IDbTransaction originalTransaction;
-
-            public IDbConnection Connection => originalTransaction.Connection;
-
-            public System.Data.IsolationLevel IsolationLevel => originalTransaction.IsolationLevel;
-
-            public void Commit()
-            {
-                originalTransaction.Commit();
-                TransactionState = ETransactionState.Committed;
-            }
-
-            public void Dispose()
-            {
-                originalTransaction.Dispose();
-                TransactionState = ETransactionState.Disposed;
-            }
-
-            public void Rollback()
-            {
-                originalTransaction.Rollback();
-                TransactionState = ETransactionState.RolledBack;
-            }
-        }
-
-
-
-        #region Execute
-
-        public int commandTimeout = 0;
-
-        public virtual int Execute(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
-        {
-            var transaction = GetCurrentTransaction();
-            commandTimeout ??= this.commandTimeout;
-            return dbConnection.Execute(sql, param: param, transaction: transaction, commandTimeout: commandTimeout, commandType: commandType);
-        }
-
-        public virtual IDataReader ExecuteReader(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
-        {
-            var transaction = GetCurrentTransaction();
-            commandTimeout ??= this.commandTimeout;
-            return dbConnection.ExecuteReader(sql, param: param, transaction: transaction, commandTimeout: commandTimeout, commandType: commandType);
-        }
-
-        public virtual object ExecuteScalar(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null)
-        {
-            var transaction = GetCurrentTransaction();
-            commandTimeout ??= this.commandTimeout;
-            return dbConnection.ExecuteScalar(sql, param: param, transaction: transaction, commandTimeout: commandTimeout, commandType: commandType);
-        }
-        #endregion
-
-    }
-}

+ 0 - 283
src/Vit.Orm/Sql/SqlDbSet.cs

@@ -1,283 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Vit.Linq.ExpressionTree.CollectionsQuery;
-
-using Vit.Linq.ExpressionTree.ComponentModel;
-using System.Linq.Expressions;
-using Vit.Orm.Entity;
-using System.Reflection;
-using Vit.Linq;
-using Vit.Orm.Sql.DataReader;
-using Vit.Extensions.Linq_Extensions;
-
-namespace Vit.Orm.Sql
-{
-    public class SqlDbSetConstructor
-    {
-        public static IDbSet CreateDbSet( SqlDbContext dbContext, Type entityType, IEntityDescriptor entityDescriptor)
-        {
-            return _CreateDbSet.MakeGenericMethod(entityType)
-                     .Invoke(null, new object[] { dbContext, entityDescriptor }) as IDbSet;
-        }
-       
-        static MethodInfo _CreateDbSet = new Func<SqlDbContext, IEntityDescriptor,IDbSet>(CreateDbSet<object>)
-                   .Method.GetGenericMethodDefinition();
-        public static IDbSet CreateDbSet<Entity>(SqlDbContext dbContext, IEntityDescriptor entityDescriptor)
-        {
-            return new SqlDbSet<Entity>(dbContext, entityDescriptor);
-        }
-
-    }
-
-    public class SqlDbSet<Entity> : Vit.Orm.DbSet<Entity>
-    {
-        protected SqlDbContext dbContext;
-
-        protected IEntityDescriptor _entityDescriptor;
-        public override IEntityDescriptor entityDescriptor => _entityDescriptor;
-
-
-        public virtual ISqlTranslator sqlTranslator => dbContext.sqlTranslator;
-
-        public SqlDbSet(SqlDbContext dbContext, IEntityDescriptor entityDescriptor)
-        {
-            this.dbContext = dbContext;
-            this._entityDescriptor = entityDescriptor;
-        }
-
-        public override void Create()
-        {
-            string sql = sqlTranslator.PrepareCreate(entityDescriptor);
-
-            dbContext.Execute(sql: sql);
-        }
-
-
-
-
-        public override Entity Add(Entity entity)
-        {
-            // #1 prepare sql
-            (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) = sqlTranslator.PrepareAdd(this);
-
-            // #2 get sql params
-            var sqlParam = GetSqlParams(entity);
-
-            // #3 execute
-            var affectedRowCount = dbContext.Execute(sql: sql, param: (object)sqlParam);
-
-            return affectedRowCount == 1 ? entity : default;
-        }
-
-        public override void AddRange(IEnumerable<Entity> entitys)
-        {
-            // #1 prepare sql
-            (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) = sqlTranslator.PrepareAdd(this);
-
-            // #2 execute
-            var affectedRowCount = 0;
-
-            foreach (var entity in entitys)
-            {
-                var sqlParam = GetSqlParams(entity);
-                if (dbContext.Execute(sql: sql, param: (object)sqlParam) == 1)
-                    affectedRowCount++;
-            }
-        }
-
-
-        public override Entity Get(object keyValue)
-        {
-            // #1 prepare sql
-            string sql = sqlTranslator.PrepareGet(this);
-
-            // #2 get sql params
-            var sqlParam = new Dictionary<string, object>();
-            sqlParam[entityDescriptor.keyName] = keyValue;
-
-            // #3 execute
-            using var reader = dbContext.ExecuteReader(sql: sql, param: (object)sqlParam);
-            if (reader.Read())
-            {
-                var entity = (Entity)Activator.CreateInstance(typeof(Entity));
-                foreach (var column in entityDescriptor.allColumns)
-                {
-                    column.Set(entity, TypeUtil.ConvertToType(reader[column.name], column.type));
-                }
-                return entity;
-            }
-            return default;
-
-
-        }
-
-
-        public override IQueryable<Entity> Query()
-        {
-            var dbContextId = "SqlDbSet_" + dbContext.GetHashCode();
-
-            Func<Expression, Type, object> QueryExecutor = (expression, type) =>
-            {
-                // #1 convert to ExpressionNode
-                // (query) => query.Where().OrderBy().Skip().Take().Select().ToList();
-                // (users) => users.SelectMany(
-                //      user => users.Where(father => (father.id == user.fatherId)).DefaultIfEmpty(),
-                //      (user, father) => new <>f__AnonymousType4`2(user = user, father = father)
-                //  ).Where().Select();
-                var isArgument = QueryableBuilder.QueryTypeNameCompare(dbContextId);
-                ExpressionNode node = dbContext.convertService.ConvertToData(expression, autoReduce: true, isArgument: isArgument);
-                //var strNode = Json.Serialize(node);
-
-
-                // #2 convert to Streams
-                // {select,left,joins,where,order,skip,take}
-                var stream = StreamReader.ReadNode(node);
-                //var strStream = Json.Serialize(stream);
-
-
-                // #3.1 ExecuteUpdate
-                if (stream is StreamToUpdate streamToUpdate)
-                {
-                    (string sql, Dictionary<string, object> sqlParam) = sqlTranslator.PrepareExecuteUpdate(streamToUpdate);
-
-                    return dbContext.Execute(sql: sql, param: (object)sqlParam);
-                }
-
-
-                // #3.3 Query
-                // #3.3.1
-                var combinedStream = stream as CombinedStream;
-                if (combinedStream == null) combinedStream = new CombinedStream("tmp") { source = stream };
-
-                // #3.3.2 execute and read result
-                switch (combinedStream.method)
-                {
-                    case nameof(Queryable_Extensions.ToExecuteString):
-                        {
-                            // ToExecuteString
-                            (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) = sqlTranslator.PrepareQuery(combinedStream, entityType: null);
-                            return sql;
-                        }
-                    case "Count":
-                        {
-                            // Count
-                            (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) = sqlTranslator.PrepareQuery(combinedStream, entityType: null);
-
-                            var count = dbContext.ExecuteScalar(sql: sql, param: (object)sqlParam);
-                            return Convert.ToInt32(count);
-                        }
-                    case nameof(Queryable_Extensions.ExecuteDelete):
-                        {
-                            // ExecuteDelete
-                            (string sql, Dictionary<string, object> sqlParam) = sqlTranslator.PrepareExecuteDelete(combinedStream);
-
-                            var count = dbContext.Execute(sql: sql, param: (object)sqlParam);
-                            return count;
-                        }
-                    case "FirstOrDefault" or "First" or "LastOrDefault" or "Last":
-                        {
-                            var entityType = expression.Type;
-                            (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) = sqlTranslator.PrepareQuery(combinedStream, entityType);
-
-                            using var reader = dbContext.ExecuteReader(sql: sql, param: (object)sqlParam);
-                            return dataReader.ReadData(reader);
-                        }
-                    case "ToList":
-                    case "":
-                    case null:
-                        {
-                            // ToList
-                            var entityType = expression.Type.GetGenericArguments()?.FirstOrDefault();
-                            (string sql, Dictionary<string, object> sqlParam, IDbDataReader dataReader) = sqlTranslator.PrepareQuery(combinedStream, entityType);
-
-                            using var reader = dbContext.ExecuteReader(sql: sql, param: (object)sqlParam);
-                            return dataReader.ReadData(reader);
-                        }
-                }
-                throw new NotSupportedException("not supported query type: " + combinedStream.method);
-            };
-            return QueryableBuilder.Build<Entity>(QueryExecutor, dbContextId);
-        }
-
-
-
-
-
-        public override int Update(Entity entity)
-        {
-            // #1 prepare sql
-            (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) = sqlTranslator.PrepareUpdate(this);
-
-            // #2 get sql params
-            var sqlParam = GetSqlParams(entity);
-
-            // #3 execute
-            var affectedRowCount = dbContext.Execute(sql: sql, param: (object)sqlParam);
-
-            return affectedRowCount;
-        }
-
-        public override int UpdateRange(IEnumerable<Entity> entitys)
-        {
-            // #1 prepare sql
-            (string sql, Func<Entity, Dictionary<string, object>> GetSqlParams) = sqlTranslator.PrepareUpdate(this);
-
-            // #2 execute
-            var affectedRowCount = 0;
-
-            foreach (var entity in entitys)
-            {
-                var sqlParam = GetSqlParams(entity);
-                affectedRowCount += dbContext.Execute(sql: sql, param: (object)sqlParam);
-            }
-            return affectedRowCount;
-        }
-
-
-
-        public override int Delete(Entity entity)
-        {
-            var key = entityDescriptor.key.Get(entity);
-            return DeleteByKey(key);
-        }
-
-        public override int DeleteRange(IEnumerable<Entity> entitys)
-        {
-            var keys = entitys.Select(entity => entityDescriptor.key.Get(entity)).ToList();
-            return DeleteByKeys(keys);
-        }
-
-
-        public override int DeleteByKey(object keyValue)
-        {
-            // #1 prepare sql
-            string sql = sqlTranslator.PrepareDelete(this);
-
-            // #2 get sql params
-            var sqlParam = new Dictionary<string, object>();
-            sqlParam[entityDescriptor.keyName] = keyValue;
-
-            // #3 execute
-            var affectedRowCount = dbContext.Execute(sql: sql, param: (object)sqlParam);
-
-            return affectedRowCount;
-        }
-
-        public override int DeleteByKeys<Key>(IEnumerable<Key> keys)
-        {
-            // #1 prepare sql
-            string sql = sqlTranslator.PrepareDeleteRange(this);
-
-            // #2 get sql params
-            var sqlParam = new Dictionary<string, object>();
-            sqlParam["keys"] = keys;
-
-            // #3 execute
-            var affectedRowCount = dbContext.Execute(sql: sql, param: (object)sqlParam);
-
-            return affectedRowCount;
-        }
-
-    }
-}

+ 0 - 22
src/Vit.Orm/Vit.Orm.csproj

@@ -1,22 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <pack>nuget</pack>
-    </PropertyGroup>
-
-    <PropertyGroup>
-        <TargetFramework>netstandard2.0</TargetFramework>
-        <Version>2.2.22-temp</Version>
-        <LangVersion>9.0</LangVersion>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <PackageReference Include="Dapper" Version="2.1.35" />
-      <PackageReference Include="Dapper.Contrib" Version="2.0.78" />
-    </ItemGroup>
-
-    <ItemGroup>
-        <ProjectReference Include="..\Vit.Linq\Vit.Linq.csproj" />
-    </ItemGroup>
-
-</Project>