/// <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); }
/// <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); } } }