Explorar el Código

Added FilterBuilder for type safe filters

Kenric Nugteren hace 1 semana
padre
commit
ff6dc3029c

+ 10 - 2
InABox.Core/CoreUtils.cs

@@ -764,7 +764,6 @@ namespace InABox.Core
             var param = Expression.Parameter(typeof(T), "x");
             Expression body = param;
             foreach (var member in name.Split('.')) body = Expression.PropertyOrField(body, member);
-            var p = Expression.Parameter(typeof(TType));
             var conversion = body.Type == typeof(TType) ? body : Expression.Convert(body, typeof(TType));
             return Expression.Lambda<Func<T, TType>>(conversion, param);
         }
@@ -774,7 +773,6 @@ namespace InABox.Core
             var param = Expression.Parameter(typeof(T), "x");
             Expression body = param;
             foreach (var member in name.Split('.')) body = Expression.PropertyOrField(body, member);
-            var p = Expression.Parameter(typeof(object));
             var conversion = Expression.Convert(body, typeof(object));
             return Expression.Lambda<Func<T, object?>>(conversion, param);
         }
@@ -1780,6 +1778,11 @@ namespace InABox.Core
 
             return filter.Parent ?? filter;
         }
+        public static Filter<T> LinkValid<T, TProp>(this FilterBuilder<T, TProp> filter, Guid entityID = default)
+            where TProp : IEntityLink
+        {
+            return filter.Filter.LinkValid(entityID);
+        }
 
         public static Filter<T> NotLinkValid<T>(this Filter<T> filter)
         {
@@ -1793,6 +1796,11 @@ namespace InABox.Core
             filter.And(subFilter);
             return filter.Parent ?? filter;
         }
+        public static Filter<T> NotLinkValid<T, TProp>(this FilterBuilder<T, TProp> filter, Guid entityID = default)
+            where TProp : IEntityLink
+        {
+            return filter.Filter.NotLinkValid();
+        }
 
         #region DeepClone Utility
 

+ 2 - 2
InABox.Core/Objects/Entity.cs

@@ -127,7 +127,7 @@ namespace InABox.Core
 
             public IFilter GetFilter(Entity parent)
             {
-                return new Filter<TChild>(Column).IsEqualTo(parent.ID);
+                return Filter<TChild>.Where<Guid>(Column).IsEqualTo(parent.ID);
             }
         }
 
@@ -144,7 +144,7 @@ namespace InABox.Core
 
             public IFilter GetFilter(Entity parent)
             {
-                return new Filter<TChild>(Column).IsEqualTo(Func(parent as TParent));
+                return Filter<TChild>.Where<object?>(Column).IsEqualTo(Func(parent as TParent));
             }
         }
 

+ 5 - 0
InABox.Core/Query/Column.cs

@@ -70,6 +70,11 @@ namespace InABox.Core
             var result = Activator.CreateInstance(type, property) as IColumn;
             return result!;
         }
+
+        public static Column<T> Create<T, TProp>(Expression<Func<T, TProp>> expression)
+        {
+            return new Column<T>(CoreUtils.GetFullPropertyName(expression, "."));
+        }
     }
 
     public class Column<T> : IColumn

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 377 - 446
InABox.Core/Query/Filter.cs


+ 1 - 1
inabox.wpf/DynamicGrid/Grids/DynamicManyToManyCrossTab.cs

@@ -278,7 +278,7 @@ public abstract class DynamicManyToManyCrossTab<TManyToMany, TRow, TColumn> : Dy
             new KeyedQueryDef<TRow>(filter, columns, sort),
             new KeyedQueryDef<TManyToMany>(
                 new Filter<TManyToMany>(rowProperty.Name + ".ID").InQuery(filter, x => x.ID)
-                    .And(columnProperty.Name + ".ID").InQuery(ColumnFilter(), x => x.ID),
+                    .And<Guid>(columnProperty.Name + ".ID").InQuery(ColumnFilter(), x => x.ID),
                 manyToManyColumns));
     }
 

+ 2 - 2
inabox.wpf/DynamicGrid/Grids/DynamicManyToManyGrid.cs

@@ -145,8 +145,8 @@ public class DynamicManyToManyGrid<TManyToMany, TThis> : DynamicGrid<TManyToMany
             }
             else
             {
-                var exp = CoreUtils.GetPropertyExpression<TManyToMany>(thisproperty.Name + ".ID");
-                var filter = new Filter<TManyToMany>(exp).IsEqualTo(Item.ID).And(exp).IsNotEqualTo(Guid.Empty);
+                var exp = CoreUtils.GetPropertyExpression<TManyToMany, Guid>(thisproperty.Name + ".ID");
+                var filter = Filter<TManyToMany>.Where(exp).IsEqualTo(Item.ID).And(exp).IsNotEqualTo(Guid.Empty);
                 var sort = LookupFactory.DefineSort<TManyToMany>();
 
                 var columns = DynamicGridUtils.LoadEditorColumns(DataColumns());

+ 2 - 2
inabox.wpf/DynamicGrid/Grids/DynamicOneToManyGrid.cs

@@ -139,8 +139,8 @@ public class DynamicOneToManyGrid<TOne, TMany> : DynamicGrid<TMany>,
             else
             {
                 var criteria = new Filters<TMany>();
-                var exp = CoreUtils.GetPropertyExpression<TMany>(property.Name + ".ID");
-                criteria.Add(new Filter<TMany>(exp).IsEqualTo(Item.ID).And(exp).IsNotEqualTo(Guid.Empty));
+                var exp = CoreUtils.GetPropertyExpression<TMany, Guid>(property.Name + ".ID");
+                criteria.Add(Filter<TMany>.Where(exp).IsEqualTo(Item.ID).And(exp).IsNotEqualTo(Guid.Empty));
                 criteria.AddRange(Criteria.Items);
                 var sort = LookupFactory.DefineSort<TMany>();
 

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio