Przeglądaj źródła

Implemented custom offset code for paging

Kenric Nugteren 11 miesięcy temu
rodzic
commit
093d93bc5b
1 zmienionych plików z 21 dodań i 3 usunięć
  1. 21 3
      inabox.database.sqlite/SQLiteProvider.cs

+ 21 - 3
inabox.database.sqlite/SQLiteProvider.cs

@@ -2258,6 +2258,24 @@ namespace InABox.Database.SQLite
             result.Add(string.Join(", ", combined.Values));
             result.Add("FROM");
             result.AddRange(tables.Select(x => x.Item3));
+
+            if (range?.Type == CoreRangeType.Database && range.Offset != 0)
+            {
+                var subColumns = Columns.None(T).Add("ID");
+
+                var subQuery = PrepareSelectNonGeneric(T, command, 'A', filter, subColumns, sort, null, null, CoreRange.Database(range.Offset), false, useparams);
+
+                var idColumn = $"{prefix}1.[ID]";
+                var offsetCondition = $"({idColumn} NOT IN ({subQuery}))";
+                if (!condition.IsNullOrWhiteSpace())
+                {
+                    condition = $"({offsetCondition} and {condition})";
+                }
+                else
+                {
+                    condition = offsetCondition;
+                }
+            }
             if (!string.IsNullOrWhiteSpace(condition))
             {
                 result.Add("WHERE");
@@ -2284,11 +2302,11 @@ namespace InABox.Database.SQLite
 
             if (range?.Type == CoreRangeType.Database)
             {
-                if (range.Offset != 0)
-                    result.Add($"OFFSET {range.Offset}");
-
                 if (range.Limit != int.MaxValue)
                     result.Add($"LIMIT {range.Limit}");
+
+                //if (range.Offset != 0)
+                //    result.Add($"OFFSET {range.Offset}");
             }
             
             return string.Join(" ", result);