diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Extensions/DatabaseExtensions.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Extensions/DatabaseExtensions.cs index a4c00840..d101e5cc 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Extensions/DatabaseExtensions.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Extensions/DatabaseExtensions.cs @@ -19,12 +19,27 @@ namespace BootstrapAdmin.Web.Extensions /// /// /// - public static Task> FetchAsync(this IDatabase db, IEnumerable where, string? sortName = null, SortOrder sortOrder = SortOrder.Unset) + public static Task> FetchAsync(this IDatabase db, QueryPageOptions options) { - var exp = where.GetFilterLambda(); var sql = new Sql(); - AnalysisExpression(exp, db, sql); + // 处理模糊查询 + if (options.Searchs.Any()) + { + var searchTextSql = new Sql(); + AnalysisExpression(options.Searchs.GetFilterLambda(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(), 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 /// /// /// - public static Task> PageAsync(this IDatabase db, long pageIndex, long pageItems, IEnumerable where, string? sortName = null, SortOrder sortOrder = SortOrder.Unset) + public static Task> PageAsync(this IDatabase db, QueryPageOptions options) { - var exp = where.GetFilterLambda(); var sql = new Sql(); - AnalysisExpression(exp, db, sql); + + // 处理模糊查询 + if (options.Searchs.Any()) + { + var searchTextSql = new Sql(); + AnalysisExpression(options.Searchs.GetFilterLambda(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(), 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(pageIndex, pageItems, sql); + return db.PageAsync(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; - } } diff --git a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DefaultDataService.cs b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DefaultDataService.cs index 06d3bc9e..710979a1 100644 --- a/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DefaultDataService.cs +++ b/src/blazor/admin/BootstrapAdmin.DataAccess.PetaPoco/Services/DefaultDataService.cs @@ -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(option.PageIndex, option.PageItems, filters, option.SortName, option.SortOrder); + var items = await Database.PageAsync(option); ret.TotalCount = Convert.ToInt32(items.TotalItems); ret.Items = items.Items; } else { - var items = await Database.FetchAsync(filters, option.SortName, option.SortOrder); + var items = await Database.FetchAsync(option); ret.TotalCount = items.Count; ret.Items = items; }