Esempio n. 1
0
        /// <summary>
        /// 执行查询,返回数据集
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <returns></returns>
        public Table <TEntity> ExecuteQuery <TEntity>()
            where TEntity : Entity
        {
            Table <TEntity> tbl = new Table <TEntity>();
            var             map = SqliteConnectionEx.GetMapping(typeof(TEntity));

            // 列定义
            foreach (var col in map.Columns)
            {
                tbl.Add(col.Name, col.ColumnType);
            }

            var reader = ExecuteReader();

            if (reader != null && reader.FieldCount > 0)
            {
                while (reader.Read())
                {
                    // 无参数构造方法可能为private,如实体类型
                    var row = (TEntity)Activator.CreateInstance(typeof(TEntity), true);
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        var name = reader.GetName(i);
                        var col  = map.FindColumn(name);

                        if (col == null)
                        {
                            // 映射类型中不存在该属性,使用数据的实际类型
                            Cell cell;
                            var  tp = reader.GetFieldType(i);
                            if (reader.IsDBNull(i))
                            {
                                // 列为可空类型时重置,因sqlie无可空类型
                                if (tp == typeof(byte[]))
                                {
                                    // 返回结果的首行数据出现dbnull时列类型不正确!
                                    if (tbl.Count == 0)
                                    {
                                        tp = typeof(string);
                                    }
                                }
                                else if (tp.IsValueType && Nullable.GetUnderlyingType(tp) == null)
                                {
                                    tp = typeof(Nullable <>).MakeGenericType(tp);
                                }
                                cell = new Cell(row, name, tp);
                            }
                            else
                            {
                                cell = new Cell(row, name, tp, reader.GetValue(i));
                            }

                            // 补充缺少的列
                            if (!tbl.Columns.Contains(name))
                            {
                                tbl.Add(name, cell.Type);
                            }
                        }
                        else
                        {
                            // 有映射属性的以属性类型为准,因sqlie数据类型少,无可空类型、bool、DateTime等
                            if (reader.IsDBNull(i))
                            {
                                new Cell(row, name, col.ColumnType);
                            }
                            else
                            {
                                new Cell(row, name, col.ColumnType, reader.GetValue(i));
                            }
                        }
                    }
                    tbl.Add(row);
                }
            }
            return(tbl);
        }
Esempio n. 2
0
        /// <summary>
        /// 延时返回查询对象,利于性能提升
        /// </summary>
        /// <typeparam name="TRow"></typeparam>
        /// <returns></returns>
        public IEnumerable <TRow> ForEach <TRow>()
            where TRow : Row
        {
            var reader = ExecuteReader();

            if (reader != null && reader.FieldCount > 0)
            {
                var map = typeof(TRow).IsSubclassOf(typeof(Entity)) ? SqliteConnectionEx.GetMapping(typeof(TRow)) : null;
                while (reader.Read())
                {
                    // 无参数构造方法可能为private,如实体类型
                    var row = (TRow)Activator.CreateInstance(typeof(TRow), true);
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        if (map == null)
                        {
                            // Row
                            var tp = reader.GetFieldType(i);
                            if (reader.IsDBNull(i))
                            {
                                // sqlite中无可空类型,只能遇到DBNull按可空类型,会造成所有Row的列类型不同!
                                // 列为可空类型时重置,因sqlie无可空类型
                                if (tp == typeof(byte[]))
                                {
                                    // 返回结果的首行数据出现dbnull时列类型不正确!
                                    tp = typeof(string);
                                }
                                else if (tp.IsValueType && Nullable.GetUnderlyingType(tp) == null)
                                {
                                    tp = typeof(Nullable <>).MakeGenericType(tp);
                                }
                                new Cell(row, reader.GetName(i), tp);
                            }
                            else
                            {
                                new Cell(row, reader.GetName(i), tp, reader.GetValue(i));
                            }
                        }
                        else
                        {
                            // Entity
                            var name = reader.GetName(i);
                            var col  = map.FindColumn(name);

                            if (col == null)
                            {
                                // 映射类型中不存在该属性,使用数据的实际类型
                                var tp = reader.GetFieldType(i);
                                if (reader.IsDBNull(i))
                                {
                                    // 列为可空类型时重置,因sqlie无可空类型
                                    if (tp == typeof(byte[]))
                                    {
                                        // 返回结果的首行数据出现dbnull时列类型不正确!
                                        tp = typeof(string);
                                    }
                                    else if (tp.IsValueType && Nullable.GetUnderlyingType(tp) == null)
                                    {
                                        tp = typeof(Nullable <>).MakeGenericType(tp);
                                    }
                                    new Cell(row, name, tp);
                                }
                                else
                                {
                                    new Cell(row, name, tp, reader.GetValue(i));
                                }
                            }
                            else
                            {
                                // 有映射属性的以属性类型为准,因sqlie数据类型少,无可空类型、bool、DateTime等
                                if (reader.IsDBNull(i))
                                {
                                    new Cell(row, name, col.ColumnType);
                                }
                                else
                                {
                                    new Cell(row, name, col.ColumnType, reader.GetValue(i));
                                }
                            }
                        }
                    }
                    yield return(row);
                }
            }
        }