using BootstrapBlazor.Components; using Microsoft.Extensions.Localization; using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; namespace UI.Data { /// /// BootstrapBlazor 服务扩展类 /// public static class TableDemoDataServiceCollectionExtensions { /// /// 增加 PetaPoco 数据库操作服务 /// /// /// public static IServiceCollection AddTableDemoDataService(this IServiceCollection services) { services.AddScoped(typeof(IDataService<>), typeof(TableDemoDataService<>)); return services; } } /// /// 演示网站示例数据注入服务实现类 /// internal class TableDemoDataService(IStringLocalizer localizer) : DataServiceBase where TModel : class, new() { private static readonly ConcurrentDictionary, string, SortOrder, IEnumerable>> SortLambdaCache = new(); [NotNull] private List? Items { get; set; } /// /// 查询操作方法 /// /// /// public override Task> QueryAsync(QueryPageOptions options) { // 此处代码实战中不可用,仅仅为演示而写防止数据全部被删除 if (Items == null || Items.Count == 0) { Items = Foo.GenerateFoo(localizer).Cast().ToList(); } var items = Items.AsEnumerable(); var isSearched = false; // 处理高级查询 if (options.SearchModel is Foo model) { if (!string.IsNullOrEmpty(model.Name)) { items = items.Cast().Where(item => item.Name?.Contains(model.Name, StringComparison.OrdinalIgnoreCase) ?? false).Cast(); } if (!string.IsNullOrEmpty(model.Address)) { items = items.Cast().Where(item => item.Address?.Contains(model.Address, StringComparison.OrdinalIgnoreCase) ?? false).Cast(); } isSearched = !string.IsNullOrEmpty(model.Name) || !string.IsNullOrEmpty(model.Address); } if (options.Searches.Count != 0) { // 针对 SearchText 进行模糊查询 items = items.Where(options.Searches.GetFilterFunc(FilterLogic.Or)); } // 过滤 var isFiltered = false; if (options.Filters.Count != 0) { items = items.Where(options.Filters.GetFilterFunc()); isFiltered = true; } // 排序 var isSorted = false; if (!string.IsNullOrEmpty(options.SortName)) { // 外部未进行排序,内部自动进行排序处理 var invoker = SortLambdaCache.GetOrAdd(typeof(Foo), key => LambdaExtensions.GetSortLambda().Compile()); items = invoker(items, options.SortName, options.SortOrder); isSorted = true; } var total = items.Count(); return Task.FromResult(new QueryData() { Items = items.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems).ToList(), TotalCount = total, IsFiltered = isFiltered, IsSorted = isSorted, IsSearch = isSearched }); } /// /// /// /// /// public override Task SaveAsync(TModel model, ItemChangedType changedType) { var ret = false; if (model is Foo foo) { if (changedType == ItemChangedType.Add) { var id = Items.Count + 1; while (Items.FirstOrDefault(item => (item as Foo)!.Id == id) != null) { id++; } var item = new Foo() { Id = id, Name = foo.Name, Address = foo.Address, Complete = foo.Complete, Count = foo.Count, DateTime = foo.DateTime, Education = foo.Education, Hobby = foo.Hobby } as TModel; Items.Add(item!); } else { var f = Items.OfType().FirstOrDefault(i => i.Id == foo.Id); if (f != null) { f.Name = foo.Name; f.Address = foo.Address; f.Complete = foo.Complete; f.Count = foo.Count; f.DateTime = foo.DateTime; f.Education = foo.Education; f.Hobby = foo.Hobby; } } ret = true; } return Task.FromResult(ret); } public override Task DeleteAsync(IEnumerable models) { foreach (var model in models) { Items.Remove(model); } return base.DeleteAsync(models); } } }