|
@@ -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);
|