feat: 支持模糊查询
This commit is contained in:
parent
2232cd2eb9
commit
32cc5c184a
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue