using System.Text.RegularExpressions; namespace MiaoYu.Shared.Admin.Models.PagingViews; /// /// 分页视图模型 /// public class PagingView { /// /// 列信息 /// public List Columns { get; set; } = new List(); /// /// 转换后数据 /// public List> DataSource { get; set; } = new List>(); /// /// 总数 /// public long Total { get; set; } /// /// 总页数 /// public long PageCount { get; set; } /// /// 一页显示多少条 /// public int Size { get; set; } /// /// 页码 /// public int Page { get; set; } /// /// 初始化 /// /// /// public PagingView(int page, int size) { Page = page; Size = size; } /// /// 创建 PagingView 对象 /// /// /// /// public static PagingView Create(int page, int size) { var pagingView = new PagingView(page, size); return pagingView; } /// /// 仓储主表实体类型 /// private Type? _mainTableEntityType; /// /// 主表实体类型 /// [JsonIgnore] public Type? MainTableEntityType => _mainTableEntityType; /// /// 创建数据源 /// /// /// /// public void BuilderDataSource(List data, Type mainTableEntityType) { _mainTableEntityType = mainTableEntityType; var propertyInfos = typeof(TEntity).GetProperties(); var fieldNames = propertyInfos.Select(item => item.Name).ToList(); var result = new List>(); foreach (var item in data) { var type = item!.GetType(); var dictionary = new Dictionary(); foreach (var fieldName in fieldNames) { dictionary[fieldName] = type?.GetProperty(fieldName)?.GetValue(item); } result.Add(dictionary); } DataSource = result; foreach (var item in fieldNames) { if (item.StartsWith("_")) continue; Columns.Add(new TableColumnView(item.ToFirstCharConvertLower(), item)); } } /// /// 创建数据源 根据 datatable /// /// /// public void BuilderDataSourceByDataTable(DataTable data, Type mainTableEntityType) { _mainTableEntityType = mainTableEntityType; var fieldNames = (from DataColumn dc in data.Columns select dc.ColumnName).ToList(); var result = new List>(); foreach (DataRow dr in data.Rows) { var dictionary = new Dictionary(); foreach (DataColumn dc in data.Columns) { dictionary.Add(dc.ColumnName, dr[dc.ColumnName]); } result.Add(dictionary); } DataSource = result; foreach (var item in fieldNames) { if (item.StartsWith("_")) continue; Columns.Add(new TableColumnView(item.ToFirstCharConvertLower(), item)); } } /// /// 获取指定列 /// /// /// /// /// public TableColumnView GetColumn(IQueryable query, Expression> queryField) { var nameQuery = Tools.GetNameByExpression(queryField); var TableColumnView = Columns .Where(w => w.FieldName.ToLower() == nameQuery.ToLower()) .FirstOrDefault(); return TableColumnView!; } /// /// 格式化值 /// /// /// /// /// /// public PagingView FormatValue(IQueryable query, Expression> queryField, Func funcValue) { var nameQuery = Tools.GetNameByExpression(queryField); foreach (var item in DataSource.Where(w => w.ContainsKey(nameQuery))) { var value = item[nameQuery]; item[nameQuery] = funcValue?.Invoke(value == null ? default : (TValue)value ?? default); } return this; } /// /// 设置列显示名称 /// /// public PagingView SetColumnDisplayName() { // 设置列显示名称 using var scope = App.CreateScope(); var databaseTableService = scope.ServiceProvider.GetService(); if (databaseTableService == null) return this; var genDbTableDtos = databaseTableService!.GetAllTablesByCache(); if (genDbTableDtos == null) return this; if (genDbTableDtos.Count == 0) return this; var table = genDbTableDtos? .Where(w => w.EntityName.ToLower() == MainTableEntityType.Name.ToLower()) .FirstOrDefault(); if (table == null) { table = genDbTableDtos? .Where(w => w.TableName.ToLower() == MainTableEntityType.Name.ToLower()) .FirstOrDefault(); } if (table == null) return this; //Columns.OrderBy(it=>it.w) foreach (var column in Columns) { var fieldName = column.FieldName.ToLower(); var tableInfo = table?.TableInfos?.FirstOrDefault(w => w.ColumnName.ToLower() == fieldName); //tableInfo.OrderById column.OrderById = tableInfo?.OrderById ?? 10; //column.Width column.Title = string.IsNullOrWhiteSpace(tableInfo?.DisplayName) ? fieldName : tableInfo.DisplayName; if (string.IsNullOrEmpty(tableInfo?.Width)) { var widthx = 100; if (tableInfo != null && tableInfo.CsType == "String") { widthx = ExtractNumberFromBrackets(tableInfo.DatabaseColumnType) ?? 0; } else { widthx = column.Title.Length * 20; } if (widthx < 100) { widthx = 100; } if (widthx > 300) { widthx = 300; } column.Width = widthx + "px"; } else { column.Width = tableInfo.Width; } column.Show = tableInfo?.IsTableColumnShow ?? true; } Columns = Columns.OrderBy(it => it.OrderById).ToList(); return this; } /// /// /// /// /// private int? ExtractNumberFromBrackets(string input) { string pattern = @"\((\d+)\)"; // 使用正则表达式匹配 Match match = Regex.Match(input, pattern); if (match.Success) { // 提取括号中的内容 string numberStr = match.Groups[1].Value; // 判断是否为数字 if (int.TryParse(numberStr, out int number)) { return number; } } // 返回null表示未找到有效的数字 return 0; } }