/// <summary> /// LiteDataTable 类型的扩展方法,实现 LiteDataTable 类型到 EntityList 类型的转换。 /// </summary> /// <typeparam name="TEntityList">The type of the entity list.</typeparam> /// <param name="table">The table.</param> /// <param name="columnMapToProperty"> /// 此参数表示表格中的列名是否直接映射实体的属性名。 /// true:表格列名就是属性名。 /// false:表格中列名映射的是实体对应的数据库表的列名,而非属性名。 /// 默认为 true。 /// </param> /// <returns></returns> public static TEntityList ToEntityList <TEntityList>(this LiteDataTable table, bool columnMapToProperty = true) where TEntityList : EntityList { //属性和对应列的键值对集合,为后面填充实体用。 var propertyMappings = new List <PropertyToColumnMapping>(10); var entityMatrix = EntityMatrix.FindByList(typeof(TEntityList)); var repo = RepositoryFacade.Find(entityMatrix.EntityType); var properties = repo.EntityMeta.EntityProperties; var columns = table.Columns; for (int i = 0, c = properties.Count; i < c; i++) { var propertyMeta = properties[i]; var property = propertyMeta.ManagedProperty; if (!property.IsReadOnly) { //这个位置是针对于时间戳的那几个字段 columnMeta 不为空 ,但是映射到数据库的 columnName 这个属性是空的。 //还有种情况是 columnMeta 为空,比如当对应的属性为 treeIndex。 var columnName = property.Name; if (!columnMapToProperty) { var columnMeta = propertyMeta.ColumnMeta; columnName = columnMeta == null ? propertyMeta.Name : columnMeta.ColumnName; } for (int columnIndex = 0, c2 = columns.Count; columnIndex < c2; columnIndex++) { var column = columns[columnIndex]; if (column.ColumnName.EqualsIgnoreCase(columnName)) { propertyMappings.Add(new PropertyToColumnMapping { Property = property, ColumnName = columnName, ColumnIndex = columnIndex }); break; } } } } return(ConvertEntitiesIntoList(table, repo, propertyMappings, columnMapToProperty) as TEntityList); }
/// <summary> /// LiteDataTable 类型的扩展方法,实现 LiteDataTable 类型到 EntityList 类型的转换。 /// </summary> /// <typeparam name="TEntityList"></typeparam> /// <param name="liteDataTable"></param> /// <param name="columnMapToProperty"> /// 此参数表示表格中的列名是否直接映射实体的属性名。 /// 如果传入 false,表示表格中的列名映射的是实体对应的数据库表的列名,而非属性名。 /// 默认为 true。 /// </param> /// <returns></returns> public static TEntityList ToEntityList <TEntityList>(this LiteDataTable liteDataTable, bool columnMapToProperty = true) where TEntityList : EntityList { var entityMatrix = EntityMatrix.FindByList(typeof(TEntityList)); var repo = RepositoryFacade.Find(entityMatrix.EntityType); //属性和对应列的键值对集合,为后面填充实体用。 var propertyToColumnMappings = new List <PropertyToColumnMapping>(10); //初始化 liteDataTable 中所有列名的集合,为后面初始化 propertyToColumnMappings 和判断属性用 。 var columns = liteDataTable.Columns; var tableColumnsNameList = new List <string>(); for (int i = 0, c = columns.Count; i < c; i++) { tableColumnsNameList.Add(columns[i].ColumnName); } //当表格中的列名映射的是实体对应的数据库表的列名,而非属性名的转换方法。 if (!columnMapToProperty) { var entityPropertyMetaList = repo.EntityMeta.EntityProperties; for (int i = 0, c = entityPropertyMetaList.Count; i < c; i++) { var propertyMeta = entityPropertyMetaList[i]; var manageProperty = propertyMeta.ManagedProperty; if (!manageProperty.IsReadOnly) { //这个位置是针对于时间戳的那几个字段 columnMeta 不为空 ,但是映射到数据库的 columnName 这个属性是空的。 //还有种情况是 columnMeta 为空,比如当对应的属性为 treeIndex。 var columnMeta = propertyMeta.ColumnMeta; var columnName = columnMeta == null ? propertyMeta.Name : columnMeta.ColumnName ?? propertyMeta.Name; for (int j = 0, c2 = tableColumnsNameList.Count; j < c2; j++) { if (tableColumnsNameList.Contains(columnName)) { propertyToColumnMappings.Add(new PropertyToColumnMapping { Property = manageProperty, ColumnName = columnName }); } } } } } else { var propertyList = repo.EntityMeta.ManagedProperties.GetCompiledProperties(); for (int i = 0, c = propertyList.Count; i < c; i++) { var property = propertyList[i]; var propertyName = property.Name; if (tableColumnsNameList.Contains(propertyName) && !property.IsReadOnly) { propertyToColumnMappings.Add(new PropertyToColumnMapping { Property = property, ColumnName = propertyName }); } } } return(ConvertEntitiesIntoList(liteDataTable, repo, propertyToColumnMappings) as TEntityList); }