Jelajahi Sumber

Added Filter.Cast for casting filters to compatible sub-types

Kenric Nugteren 7 bulan lalu
induk
melakukan
2b49bb3892
1 mengubah file dengan 61 tambahan dan 20 penghapusan
  1. 61 20
      InABox.Core/Query/Filter.cs

+ 61 - 20
InABox.Core/Query/Filter.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Net.Sockets;
 using System.Reflection;
 using System.Runtime.Serialization;
 using Newtonsoft.Json;
@@ -399,6 +400,8 @@ namespace InABox.Core
 
         IEnumerable<IFilter> IFilter.Ors => Ors;
 
+        #region And
+
         public IFilter And<T1>(Expression<Func<T1, object>> expression)
         {
             return And(CoreUtils.GetFullPropertyName(expression, "."));
@@ -413,26 +416,6 @@ namespace InABox.Core
 
         IFilter IFilter.And(string property) => And(property);
 
-        public Filter<T> TextSearch(string terms, params Expression<Func<T, string>>[] expressions)
-        {
-            //String[] comps = terms.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
-            //foreach (var comp in comps)
-            //{
-            //    Filter<T> search = null;
-            //    foreach (var expression in expressions)
-            //        search = search == null ? new Filter<T>(expression).Contains(comp.Trim()) : search.Or(expression).Contains(comp.Trim());
-            //    Ands.Add(search);
-            //}            
-            Filter<T>? search = null;
-            foreach (var expression in expressions)
-                search = search == null
-                    ? new Filter<T>(CoreUtils.GetFullPropertyName(expression, ".")).Contains(terms.Trim())
-                    : search.Or(CoreUtils.GetFullPropertyName(expression, ".")).Contains(terms.Trim());
-            if(search != null)
-                Ands.Add(search);
-            return this;
-        }
-
         public Filter<T> And(Filter<T> filter)
         {
             filter.Parent = this;
@@ -474,6 +457,30 @@ namespace InABox.Core
             return result;
         }
 
+        #endregion
+
+        public Filter<T> TextSearch(string terms, params Expression<Func<T, string>>[] expressions)
+        {
+            //String[] comps = terms.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
+            //foreach (var comp in comps)
+            //{
+            //    Filter<T> search = null;
+            //    foreach (var expression in expressions)
+            //        search = search == null ? new Filter<T>(expression).Contains(comp.Trim()) : search.Or(expression).Contains(comp.Trim());
+            //    Ands.Add(search);
+            //}            
+            Filter<T>? search = null;
+            foreach (var expression in expressions)
+                search = search == null
+                    ? new Filter<T>(CoreUtils.GetFullPropertyName(expression, ".")).Contains(terms.Trim())
+                    : search.Or(CoreUtils.GetFullPropertyName(expression, ".")).Contains(terms.Trim());
+            if(search != null)
+                Ands.Add(search);
+            return this;
+        }
+
+        #region Or
+
         public IFilter Or<T1>(Expression<Func<T1, object>> expression)
         {
             return Or(CoreUtils.GetFullPropertyName(expression, "."));
@@ -509,6 +516,10 @@ namespace InABox.Core
             return or;
         }
 
+        #endregion
+
+        #region ApplyOperator
+
         private Filter<T> ApplyOperator<TValue>(Operator action, TValue value) where TValue : struct
         {
             Operator = action;
@@ -572,6 +583,8 @@ namespace InABox.Core
             return Parent ?? this;
         }
 
+        #endregion
+
         //public override void GetObjectData(SerializationInfo info, StreamingContext context)
         //{
         //	base.GetObjectData(info, context);
@@ -659,6 +672,34 @@ namespace InABox.Core
 
         #endregion
 
+        #region Casting
+
+        public Filter<TNew> Cast<TNew>()
+            where TNew : T
+        {
+            var prop = "";
+            if (CoreUtils.TryFindMemberExpression(Expression, out var mexp))
+            {
+                prop = CoreUtils.GetFullPropertyName(mexp, ".");
+            }
+
+            var filter = new Filter<TNew>(prop);
+            filter.Operator = Operator;
+            filter.Value = Value;
+            filter.IsNot = IsNot;
+            foreach(var and in Ands)
+            {
+                filter.And(and.Cast<TNew>());
+            }
+            foreach(var or in Ors)
+            {
+                filter.Or(or.Cast<TNew>());
+            }
+            return filter;
+        }
+
+        #endregion
+
         #region IsEqualTo
 
         public Filter<T> IsEqualTo(bool value) => ApplyOperator(Operator.IsEqualTo, value);