feat: 支持模糊查询

This commit is contained in:
Argo-Tianyi 2021-12-15 12:20:00 +08:00
parent 2232cd2eb9
commit 32cc5c184a
2 changed files with 47 additions and 11 deletions

View File

@ -19,12 +19,27 @@ namespace BootstrapAdmin.Web.Extensions
/// </summary> /// </summary>
/// <typeparam name="TModel"></typeparam> /// <typeparam name="TModel"></typeparam>
/// <returns></returns> /// <returns></returns>
public static Task<List<TModel>> FetchAsync<TModel>(this IDatabase db, IEnumerable<IFilterAction> where, string? sortName = null, SortOrder sortOrder = SortOrder.Unset) public static Task<List<TModel>> FetchAsync<TModel>(this IDatabase db, QueryPageOptions options)
{ {
var exp = where.GetFilterLambda<TModel>();
var sql = new Sql(); var sql = new Sql();
AnalysisExpression(exp, db, sql);
// 处理模糊查询
if (options.Searchs.Any())
{
var searchTextSql = new Sql();
AnalysisExpression(options.Searchs.GetFilterLambda<TModel>(FilterLogic.Or), db, searchTextSql);
sql.Append(searchTextSql.ToString().Replace("\nAND", "\nOR"), searchTextSql.Arguments);
}
// 处理高级搜索与过滤
var filters = options.Filters.Concat(options.CustomerSearchs);
if (filters.Any())
{
AnalysisExpression(filters.GetFilterLambda<TModel>(), db, sql);
}
var sortName = options.SortName;
var sortOrder = options.SortOrder;
if (!string.IsNullOrEmpty(sortName) && sortOrder != SortOrder.Unset) if (!string.IsNullOrEmpty(sortName) && sortOrder != SortOrder.Unset)
{ {
sql.OrderBy(sortOrder == SortOrder.Asc ? sortName : $"{sortName} desc"); sql.OrderBy(sortOrder == SortOrder.Asc ? sortName : $"{sortName} desc");
@ -37,17 +52,33 @@ namespace BootstrapAdmin.Web.Extensions
/// </summary> /// </summary>
/// <typeparam name="TModel"></typeparam> /// <typeparam name="TModel"></typeparam>
/// <returns></returns> /// <returns></returns>
public static Task<Page<TModel>> PageAsync<TModel>(this IDatabase db, long pageIndex, long pageItems, IEnumerable<IFilterAction> where, string? sortName = null, SortOrder sortOrder = SortOrder.Unset) public static Task<Page<TModel>> PageAsync<TModel>(this IDatabase db, QueryPageOptions options)
{ {
var exp = where.GetFilterLambda<TModel>();
var sql = new Sql(); var sql = new Sql();
AnalysisExpression(exp, db, sql);
// 处理模糊查询
if (options.Searchs.Any())
{
var searchTextSql = new Sql();
AnalysisExpression(options.Searchs.GetFilterLambda<TModel>(FilterLogic.Or), db, searchTextSql);
sql.Append(searchTextSql.ToString().Replace("\nAND", "OR"), searchTextSql.Arguments);
}
// 处理高级搜索与过滤
var filters = options.Filters.Concat(options.CustomerSearchs);
if (filters.Any())
{
AnalysisExpression(filters.GetFilterLambda<TModel>(), db, sql);
}
var sortName = options.SortName;
var sortOrder = options.SortOrder;
if (!string.IsNullOrEmpty(sortName) && sortOrder != SortOrder.Unset) if (!string.IsNullOrEmpty(sortName) && sortOrder != SortOrder.Unset)
{ {
sql.OrderBy(sortOrder == SortOrder.Asc ? sortName : $"{sortName} desc"); sql.OrderBy(sortOrder == SortOrder.Asc ? sortName : $"{sortName} desc");
} }
return db.PageAsync<TModel>(pageIndex, pageItems, sql); return db.PageAsync<TModel>(options.PageIndex, options.PageItems, sql);
} }
private static void AnalysisExpression(Expression expression, IDatabase db, Sql sql) private static void AnalysisExpression(Expression expression, IDatabase db, Sql sql)
@ -67,6 +98,13 @@ namespace BootstrapAdmin.Web.Extensions
AnalysisExpression(andExp.Right, db, sql); AnalysisExpression(andExp.Right, db, sql);
} }
break; break;
case ExpressionType.OrElse:
if (expression is BinaryExpression orExp)
{
AnalysisExpression(orExp.Left, db, sql);
AnalysisExpression(orExp.Right, db, sql);
}
break;
case ExpressionType.Call: case ExpressionType.Call:
if (expression is MethodCallExpression callExp) if (expression is MethodCallExpression callExp)
{ {
@ -122,7 +160,6 @@ namespace BootstrapAdmin.Web.Extensions
} }
} }
break; break;
} }
} }

View File

@ -67,17 +67,16 @@ namespace BootstrapBlazor.DataAcces.PetaPoco.Services
IsSearch = true IsSearch = true
}; };
var filters = option.Filters.Concat(option.Searchs).Concat(option.CustomerSearchs);
if (option.IsPage) if (option.IsPage)
{ {
var items = await Database.PageAsync<TModel>(option.PageIndex, option.PageItems, filters, option.SortName, option.SortOrder); var items = await Database.PageAsync<TModel>(option);
ret.TotalCount = Convert.ToInt32(items.TotalItems); ret.TotalCount = Convert.ToInt32(items.TotalItems);
ret.Items = items.Items; ret.Items = items.Items;
} }
else else
{ {
var items = await Database.FetchAsync<TModel>(filters, option.SortName, option.SortOrder); var items = await Database.FetchAsync<TModel>(option);
ret.TotalCount = items.Count; ret.TotalCount = items.Count;
ret.Items = items; ret.Items = items;
} }