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>
/// <typeparam name="TModel"></typeparam>
/// <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();
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)
{
sql.OrderBy(sortOrder == SortOrder.Asc ? sortName : $"{sortName} desc");
@ -37,17 +52,33 @@ namespace BootstrapAdmin.Web.Extensions
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <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();
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)
{
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)
@ -67,6 +98,13 @@ namespace BootstrapAdmin.Web.Extensions
AnalysisExpression(andExp.Right, db, sql);
}
break;
case ExpressionType.OrElse:
if (expression is BinaryExpression orExp)
{
AnalysisExpression(orExp.Left, db, sql);
AnalysisExpression(orExp.Right, db, sql);
}
break;
case ExpressionType.Call:
if (expression is MethodCallExpression callExp)
{
@ -122,7 +160,6 @@ namespace BootstrapAdmin.Web.Extensions
}
}
break;
}
}

View File

@ -67,17 +67,16 @@ namespace BootstrapBlazor.DataAcces.PetaPoco.Services
IsSearch = true
};
var filters = option.Filters.Concat(option.Searchs).Concat(option.CustomerSearchs);
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.Items = items.Items;
}
else
{
var items = await Database.FetchAsync<TModel>(filters, option.SortName, option.SortOrder);
var items = await Database.FetchAsync<TModel>(option);
ret.TotalCount = items.Count;
ret.Items = items;
}