Browse Source

Improved AutoIncrement Calculations

frogsoftware 1 week ago
parent
commit
4bcf8decea
1 changed files with 28 additions and 21 deletions
  1. 28 21
      InABox.Database/Stores/Store.cs

+ 28 - 21
InABox.Database/Stores/Store.cs

@@ -306,29 +306,36 @@ namespace InABox.Database
 
                 if (requiredEntities.Count > 0)
                 {
+                    var sql = string.IsNullOrWhiteSpace(prefix)
+                        ? $"select max(cast({prop.Name} as integer)) from {typeof(T).Name.Split('.').Last()}"
+                        : $"select max(cast(substr({prop.Name},{prefix.Length+1}) as integer)) from {typeof(T).Name.Split('.').Last()} where {prop.Name} like '{prefix}%'";
+                    var result = Provider.List(sql);
+                    int.TryParse(result.FirstOrDefault()?.FirstOrDefault()?.ToString() ?? "0", out int newvalue);
                     
-                    var filter = new Filter<T>(prop.Name).IsGreaterThanOrEqualTo(String.Format("{0}0",prefix))
-                        .And(prop.Name).IsLessThanOrEqualTo(String.Format("{0}9999999999", prefix));
                     
-                    var filter2 = autoinc.AutoIncrementFilter();
-                    if (filter2 != null)
-                        filter = filter.And(filter2);
-                    
-                    var newvalue = 0;
-                    var row = Provider.Query(
-                        filter,
-                        Columns.None<T>().Add(prop.Name),
-                        new SortOrder<T>(prop.Name, SortDirection.Descending),
-                        CoreRange.Database(1)
-                    ).Rows.FirstOrDefault();
-                    if (row != null)
-                    {
-                        var id = row.Get<string>(prop.Name);
-                        if (!string.IsNullOrWhiteSpace(prefix))
-                            id = id.Substring(prefix.Length);
-                        id = new string(id.Where(c => char.IsDigit(c)).ToArray());
-                        int.TryParse(id, out newvalue);
-                    }
+                    // var filter =  new Filter<T>(prop.Name).IsGreaterThanOrEqualTo(String.Format("{0}0",prefix))
+                    //     .And(prop.Name).IsLessThanOrEqualTo(String.Format("{0}9999999999", prefix));
+                    //
+                    // var filter2 = autoinc.AutoIncrementFilter();
+                    // if (filter2 != null)
+                    //     filter = filter.And(filter2);
+                    //
+                    // var newvalue = 0;
+                    // var row = Provider.Query(
+                    //     filter,
+                    //     Columns.None<T>().Add(prop.Name),
+                    //     new SortOrder<T>(prop.Name, SortDirection.Descending),
+                    //     CoreRange.Database(1)
+                    // ).Rows.FirstOrDefault();
+                    // if (row != null)
+                    // {
+                    //     var id = row.Get<string>(prop.Name);
+                    //     if (!string.IsNullOrWhiteSpace(prefix))
+                    //         id = id.Substring(prefix.Length);
+                    //     id = new string(id.Where(c => char.IsDigit(c)).ToArray());
+                    //     int.TryParse(id, out newvalue);
+                    // }
+                    //
                     
                     foreach (var entity in requiredEntities)
                     {