using System; using System.Collections.Generic; using System.Text; namespace Apewer.Source { /// ORM 帮助程序。 public static class OrmHelper { private static List Convert(List input) where T : IRecord { if (input == null) return null; var output = new List(input.Count); foreach (var record in input) { if (record == null) continue; var t = (T)record; output.Add(t); } return output; } private static Result Convert(Result input) where T : IRecord { if (input == null) return null; var result = new Result(); result.Code = input.Code; result.Exception = input.Exception; result.Message = input.Message; if (input.HasEntity) result.Entity = (T)input.Entity; return result; } private static Result> Convert(Result> input) where T : IRecord { if (input == null) return null; var result = new Result>(); result.Code = input.Code; result.Exception = input.Exception; result.Message = input.Message; result.Entity = Convert(input.Entity); return result; } /// 查询记录。 /// 数据库对象。 /// 记录模型。 /// SQL 语句。 public static Result> Query(IDatabase database, Type model, string sql) { if (database == null) return Result>.Error("数据库无效。"); if (model == null) return Result>.Error("模型类型无效。"); if (string.IsNullOrEmpty(sql)) return Result>.Error("SQL 语句无效。"); using (var query = database.Query(sql) as Query) { if (query == null) return Result>.Error("查询实例无效。"); if (query.Exception != null) return Result>.Error(query.Exception); try { var list = query.Fill(model); return new Result>(list); } catch (Exception ex) { return Result>.Error(ex); } } } /// 查询记录。 /// 记录模型。 /// 数据库对象。 /// SQL 语句。 public static Result> Query(IDatabase database, string sql) where T : IRecord { return Convert(Query(database, typeof(T), sql)); } /// 查询记录。 /// 数据库对象。 /// 记录模型。 /// 生成 SQL 语句的函数,传入参数为表名。 public static Result> Query(IDatabase database, Type model, Func sqlGetter) { if (sqlGetter == null) return Result>.Error("SQL 语句获取函数无效。"); try { var tableName = TableStructure.ParseModel(model).Table; if (string.IsNullOrEmpty(tableName)) return Result>.Error("表名无效。"); return Query(database, model, sqlGetter(tableName)); } catch (Exception ex) { return Result>.Error(ex); } } /// 查询记录。 /// 记录模型。 /// 数据库对象。 /// 生成 SQL 语句的函数,传入参数为表名。 public static Result> Query(IDatabase database, Func sqlGetter) where T : IRecord { return Convert(Query(database, typeof(T), sqlGetter)); } /// 获取具有指定主键的记录。 /// 数据库对象。 /// 记录模型。 /// 主键。 /// 生成 SQL 语句的函数,传入参数为表名和主键值。 public static Result Get(IDatabase database, Type model, string key, Func sqlGetter) { if (sqlGetter == null) return Result.Error("SQL 语句获取函数无效。"); var safetyKey = TextUtility.SafeKey(key); if (string.IsNullOrEmpty(safetyKey)) return Result.Error("主键无效。"); string tableName; try { tableName = TableStructure.ParseModel(model).Table; if (string.IsNullOrEmpty(tableName)) return Result.Error("表名无效。"); } catch (Exception ex) { return new Result(ex); } var sql = sqlGetter(tableName, safetyKey); var list = Query(database, model, sql); var result = new Result(); result.Code = list.Code; result.Exception = list.Exception; result.Message = list.Message; result.Entity = list.Entity.SafeFirst(); return result; } /// 获取具有指定主键的记录。 /// 记录模型。 /// 数据库对象。 /// 主键。 /// 生成 SQL 语句的函数,传入参数为表名和主键值。 public static Result Get(IDatabase database, string key, Func sqlGetter) where T : IRecord { return Convert(Get(database, typeof(T), key, sqlGetter)); } /// 获取主键。 /// 数据库对象。 /// 记录模型。 /// 生成 SQL 语句的函数,传入参数为表名。 public static Result> Keys(IDatabase database, Type model, Func sqlGetter) { if (database == null) return Result>.Error("数据库无效。"); if (model == null) return Result>.Error("模型类型无效。"); if (sqlGetter == null) return Result>.Error("SQL 语句获取函数无效。"); var tableStructure = null as TableStructure; try { tableStructure = TableStructure.ParseModel(model); } catch (Exception ex) { return Result>.Error(ex); } var tableName = tableStructure.Table; if (string.IsNullOrEmpty(tableName)) return Result>.Error("表名无效。"); // var keyName = null as string; // foreach (var column in tableStructure.Columns) // { // if (column.Key == "Key") // { // keyName = column.Value.Field; // break; // } // } // if (string.IsNullOrEmpty(keyName)) return Result>.Error("主键字段无效。"); // var sql = sqlGetter(tableName, keyName); var sql = sqlGetter(tableName); var query = null as IQuery; try { query = database.Query(sql); if (query == null) return Result>.Error("查询实例无效。"); var list = new List(query.Rows); for (var r = 0; r < query.Rows; r++) { var key = TextUtility.SafeKey(query.Text(r)); if (string.IsNullOrEmpty(key)) continue; list.Add(key); } query.Dispose(); list.Capacity = list.Count; return new Result>(list); } catch (Exception ex) { RuntimeUtility.Dispose(query); return Result>.Error(ex); } } /// 获取主键。 /// 记录模型。 /// 数据库对象。 /// 生成 SQL 语句的函数,传入参数为表名。 public static Result> Keys(IDatabase database, Func sqlGetter) where T : IRecord { return Keys(database, typeof(T), sqlGetter); } } }