示例#1
0
        /// <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);
        }