Browse Source

- [Vitorm] new feature to query TotalCount(Vit.Linq.Queryable_Extensions.TotalCount)
and query List and TotalCount(Vit.Linq.Queryable_Extensions.ToListAndTotalCount) at one request

Lith 10 months ago
parent
commit
90849f5c37

+ 3 - 2
src/Vitorm.ClickHouse/DbContext_Extensions_UseClickHouse.cs

@@ -19,7 +19,8 @@ namespace Vitorm
             dbContext.Init(
                 sqlTranslateService: Vitorm.ClickHouse.SqlTranslateService.Instance,
                 dbConnectionProvider: config.ToDbConnectionProvider(),
-                sqlExecutor: SqlExecutorWithoutNull.Instance
+                sqlExecutor: SqlExecutorWithoutNull.Instance,
+                extraConfig: extraConfig
                 );
 
             if (config.commandTimeout.HasValue) dbContext.commandTimeout = config.commandTimeout.Value;
@@ -27,7 +28,7 @@ namespace Vitorm
             return dbContext;
         }
 
-
+        readonly static Dictionary<string, object> extraConfig = new() { ["query_ToListAndTotalCount_InvokeInOneExecute"] = false };
 
 
         class SqlExecutorWithoutNull : SqlExecutor

+ 20 - 1
test/Vitorm.ClickHouse.MsTest/CommonTest/Query_LinqMethods_Count_Test.cs

@@ -26,7 +26,26 @@ namespace Vitorm.MsTest.CommonTest
             using var dbContext = DataSource.CreateDbContext();
             var userQuery = dbContext.Query<User>();
 
-            TestAllCase(userQuery, new Config { skip = 1, take = 100 });
+            TestAllCase(userQuery, new Config { skip = 0 });
+            TestAllCase(userQuery, new Config { skip = 1 });
+            TestAllCase(userQuery, new Config { skip = 10 });
+
+            TestAllCase(userQuery, new Config { take = 0 });
+            TestAllCase(userQuery, new Config { take = 2 });
+            TestAllCase(userQuery, new Config { take = 20 });
+
+
+            TestAllCase(userQuery, new Config { skip = 0, take = 0 });
+            TestAllCase(userQuery, new Config { skip = 0, take = 2 });
+            TestAllCase(userQuery, new Config { skip = 0, take = 20 });
+
+            TestAllCase(userQuery, new Config { skip = 1, take = 0 });
+            TestAllCase(userQuery, new Config { skip = 1, take = 2 });
+            TestAllCase(userQuery, new Config { skip = 1, take = 20 });
+
+            TestAllCase(userQuery, new Config { skip = 10, take = 0 });
+            TestAllCase(userQuery, new Config { skip = 10, take = 2 });
+            TestAllCase(userQuery, new Config { skip = 10, take = 20 });
         }
 
 

+ 79 - 0
test/Vitorm.ClickHouse.MsTest/CommonTest/Query_LinqMethods_ToListAndTotalCount_Test.cs

@@ -0,0 +1,79 @@
+using System.Data;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Vit.Linq;
+
+namespace Vitorm.MsTest.CommonTest
+{
+
+    [TestClass]
+    public class Query_LinqMethods_ToListAndTotalCount_Test
+    {
+
+        [TestMethod]
+        public void Test_ToListAndTotalCount()
+        {
+            using var dbContext = DataSource.CreateDbContext();
+            var userQuery = dbContext.Query<User>();
+
+            var query = userQuery
+                     .Where(user => user.id > 2)
+                     .OrderBy(m => m.id)
+                     .Select(user => new { id = user.id, name = user.name })
+                     ;
+
+
+            Test(query, expectedCount: 4, expectedTotalCount: 4);
+
+
+            Test(query.Skip(0), expectedCount: 4, expectedTotalCount: 4);
+            Test(query.Skip(1), expectedCount: 3, expectedTotalCount: 4);
+            Test(query.Skip(10), expectedCount: 0, expectedTotalCount: 4);
+
+            Test(query.Take(0), expectedCount: 0, expectedTotalCount: 4);
+            Test(query.Take(2), expectedCount: 2, expectedTotalCount: 4);
+            Test(query.Take(20), expectedCount: 4, expectedTotalCount: 4);
+
+
+
+            Test(query.Skip(0).Take(0), expectedCount: 0, expectedTotalCount: 4);
+            Test(query.Skip(0).Take(2), expectedCount: 2, expectedTotalCount: 4);
+            Test(query.Skip(0).Take(10), expectedCount: 4, expectedTotalCount: 4);
+
+            Test(query.Skip(1).Take(0), expectedCount: 0, expectedTotalCount: 4);
+            Test(query.Skip(1).Take(2), expectedCount: 2, expectedTotalCount: 4);
+            Test(query.Skip(1).Take(10), expectedCount: 3, expectedTotalCount: 4);
+
+            Test(query.Skip(10).Take(0), expectedCount: 0, expectedTotalCount: 4);
+            Test(query.Skip(10).Take(2), expectedCount: 0, expectedTotalCount: 4);
+            Test(query.Skip(10).Take(10), expectedCount: 0, expectedTotalCount: 4);
+
+        }
+
+
+
+        void Test<T>(IQueryable<T> query, int expectedCount, int expectedTotalCount)
+        {
+            // Count
+            {
+                var count = query.Count();
+                Assert.AreEqual(expectedCount, count);
+            }
+            // TotalCount
+            {
+                var totalCount = query.TotalCount();
+                Assert.AreEqual(expectedTotalCount, totalCount);
+            }
+            // ToListAndTotalCount
+            {
+                var (list, totalCount) = query.ToListAndTotalCount();
+                Assert.AreEqual(expectedCount, list.Count);
+                Assert.AreEqual(expectedTotalCount, totalCount);
+            }
+        }
+
+
+
+    }
+}