added some extension and made available the code to bind easily to aspnetcore trough interface.
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
using PoweredSoft.DynamicQuery.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
namespace PoweredSoft.DynamicQuery.Extensions
|
||||
{
|
||||
public static class FilterExtensions
|
||||
{
|
||||
public static bool IsSimpleFilter(this IFilter filter) => filter is ISimpleFilter;
|
||||
public static bool IsCompositeFilter(this IFilter filter) => filter is ICompositeFilter;
|
||||
|
||||
public static bool IsSimpleFilterOn(this IFilter filter, string path)
|
||||
{
|
||||
var simpleFilter = filter as ISimpleFilter;
|
||||
if (simpleFilter == null)
|
||||
return false;
|
||||
|
||||
var result = simpleFilter.Path?.Equals(path, StringComparison.InvariantCultureIgnoreCase) == true;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static bool IsSimpleFilterOn<T>(this IFilter filter, Expression<Func<T, object>> expr)
|
||||
{
|
||||
var resolved = GetPropertySymbol(expr);
|
||||
return filter.IsSimpleFilterOn(resolved);
|
||||
}
|
||||
|
||||
public static ISimpleFilter ReplaceByOn(this IFilter filter, string path)
|
||||
{
|
||||
var simpleFilter = filter as ISimpleFilter;
|
||||
if (simpleFilter == null)
|
||||
throw new Exception("Must be a simple filter");
|
||||
|
||||
var ret = new SimpleFilter();
|
||||
ret.And = filter.And;
|
||||
ret.Type = filter.Type;
|
||||
ret.Value = simpleFilter.Value;
|
||||
ret.Path = path;
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static ISimpleFilter ReplaceByOn<T>(this IFilter filter, Expression<Func<T, object>> expr)
|
||||
{
|
||||
var resolved = GetPropertySymbol(expr);
|
||||
return filter.ReplaceByOn(resolved);
|
||||
}
|
||||
|
||||
public static ICompositeFilter ReplaceByCompositeOn(this IFilter filter, params string[] paths)
|
||||
{
|
||||
var simpleFilter = filter as ISimpleFilter;
|
||||
if (simpleFilter == null)
|
||||
throw new Exception("Must be a simple filter");
|
||||
|
||||
var compositeFilter = new CompositeFilter();
|
||||
compositeFilter.And = filter.And;
|
||||
compositeFilter.Type = FilterType.Composite;
|
||||
compositeFilter.Filters = paths
|
||||
.Select(t => new SimpleFilter
|
||||
{
|
||||
Type = filter.Type,
|
||||
Path = t,
|
||||
And = false,
|
||||
Value = simpleFilter.Value
|
||||
})
|
||||
.AsEnumerable<IFilter>()
|
||||
.ToList();
|
||||
return compositeFilter;
|
||||
}
|
||||
|
||||
public static ICompositeFilter ReplaceByCompositeOn<T>(this IFilter filter, params Expression<Func<T, object>>[] exprs)
|
||||
{
|
||||
var paths = exprs.Select(expr => GetPropertySymbol(expr)).ToArray();
|
||||
return ReplaceByCompositeOn(filter, paths);
|
||||
}
|
||||
|
||||
internal static string GetPropertySymbol<T, TResult>(Expression<Func<T, TResult>> expression)
|
||||
{
|
||||
return string.Join(".",
|
||||
GetMembersOnPath(expression.Body as MemberExpression)
|
||||
.Select(m => m.Member.Name)
|
||||
.Reverse());
|
||||
}
|
||||
|
||||
internal static IEnumerable<MemberExpression> GetMembersOnPath(MemberExpression expression)
|
||||
{
|
||||
while (expression != null)
|
||||
{
|
||||
yield return expression;
|
||||
expression = expression.Expression as MemberExpression;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
<RepositoryUrl>https://github.com/PoweredSoft/DynamicQuery</RepositoryUrl>
|
||||
<RepositoryType>github</RepositoryType>
|
||||
<PackageTags>powered,soft,dynamic,criteria,query,builder</PackageTags>
|
||||
<Version>1.0.4</Version>
|
||||
<Version>1.0.5</Version>
|
||||
<PackageIconUrl>https://secure.gravatar.com/avatar/4e32f73820c16718909a06c2927f1f8b?s=512&amp;r=g&amp;d=retro</PackageIconUrl>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user