本文档基于 User 实体,完整说明 Animal ORM 查询 / 分页 / 条件 / CRUD / 调试 等全部常用 API 的使用方式,面向 业务开发者 & 框架使用者。
x[Tiger("sys_user")]public class User{ [Koala(true)] [Cat("id")] public int Id { get; set; } [Cat("user_name")] public string Name { get; set; } [Cat("phone")] public string Phone { get; set; } [Cat("email")] public string Email { get; set; } [Cat("password_hash")] public string Password { get; set; } [Cat("is_active")] public bool IsActive { get; set; } [Cat("is_deleted")] public bool IsDeleted { get; set; } [Cat("create_time")] public DateTime CreateTime { get; set; } [Cat("update_time")] public DateTime? UpdateTime { get; set; }}xxxxxxxxxxCREATE TABLE [dbo].[sys_user] ( [id] INT IDENTITY(1,1) NOT NULL, [user_name] NVARCHAR(100) NOT NULL, [phone] NVARCHAR(50) NULL, [email] NVARCHAR(100) NULL, [password_hash] NVARCHAR(255) NOT NULL, [is_active] BIT NOT NULL DEFAULT(1), [is_deleted] BIT NOT NULL DEFAULT(0), [create_time] DATETIME NOT NULL DEFAULT(GETDATE()), [update_time] DATETIME NULL, CONSTRAINT [PK_sys_user] PRIMARY KEY CLUSTERED ([id] ASC));--SqlServerxxxxxxxxxxvar constr = "Data Source=localhost;Initial Catalog=test;User Id=sa; Password=*******";using (var db = AnimalDb.Create(constr, AnimalDbProvider.SqlServer)){ var list = db.Query<User>().ToList();}xxxxxxxxxxvar list = db.Query<User>() .Where(x => !x.IsDeleted) .Where(x => x.IsActive==true) .ToList();SQL 语义:
xxxxxxxxxxWHERE IsDeleted = 0 AND IsActive = 1xxxxxxxxxxbool? isActive = false;string name = "A";var list = db.Query<User>() .WhereIF(!string.IsNullOrEmpty(name), x => x.Name == name) .WhereIF(isActive != null, x => x.IsActive == isActive) .ToList();适用于:
xxxxxxxxxxvar keyword = "123";var list = db.Query<User>() .Where(x => !x.IsDeleted) .OrIF(!string.IsNullOrEmpty(keyword), x => x.Name.Contains(keyword)) .OrIF(!string.IsNullOrEmpty(keyword), x => x.Phone.Contains(keyword)) .ToList();xxxxxxxxxxvar keyword = "kw";var list = db.Query<User>() .Where(x => x.IsDeleted) .OrGroup(g => g .OrIF(!string.IsNullOrEmpty(keyword), x => x.Name.Contains(keyword)) .OrIF(!string.IsNullOrEmpty(keyword), x => x.Phone.Contains(keyword)) ) .ToList();SQL 语义:
xxxxxxxxxxWHERE IsDeleted = 0AND (Name LIKE '%kw%' OR Phone LIKE '%kw%')xxxxxxxxxxDateTime? start= DateTime.Now;DateTime? end = null;var list = db.Query<User>() .Where(x => x.IsDeleted) .AndGroup(g => g .WhereIF(start != null, x => x.CreateTime >= start) .WhereIF(end != null, x => x.CreateTime <= end) ) .ToList();SQL 语义:
xxxxxxxxxxWHERE IsDeleted = 0AND (CreateTime >= @start AND CreateTime <= @end)xxxxxxxxxxdb.Query<User>() .OrderBy(x => x.Name) .ToList();db.Query<User>() .OrderByDesc(x => x.Id) .ToList();xxxxxxxxxxvar page = new Pandas { PIndex = 1, PSize = 20 };var list = db.Query<User>() .Where(x => !x.IsDeleted) .OrderByDesc(x => x.Id) .Page(page) .ToList();xxxxxxxxxxint total;var list = db.Query<User>() .Where(x => !x.IsDeleted) .ToPageList(new Pandas { PIndex = 1, PSize = 20 }, out total);xxxxxxxxxx Pandas page = new Pandas() { PIndex = 1, PSize = 10, POrderby = "id asc" // The SqlServer POrderby must be assigned a value };string sql = @"SELECT U.* FROM sys_user U Join sys_user U2 on U.id=U2.id where U.id>@id";var resultList = db.FlyPigs<User>(page, sql, new { id = 1 });//Total query recordsvar totalRecords = page.PRecords;xxxxxxxxxxvar user = db.Query<User>() .Where(x => x.Id > 10) .FirstBlood(); // need check user is not nullvar user = db.SingleDog<User>(1);bool exists = db.Query<User>() .Where(x => x.Phone == "13899988880") .HasData();int count = db.Query<User>() .Where(x => x.IsActive) .Count();xxxxxxxxxx bool Add<T>(T t) where T : class,new(); bool Save<T>(T t) where T : class, new(); bool Delete<T>(object keyValue) where T : class, new(); bool Delete<TResult>(Expression<Func<TResult, bool>> func=null ) where TResult : class, new();xxxxxxxxxxdb.Add(new User{ Name = "Tom", Password = "13456", IsActive = true, IsDeleted = false, CreateTime = DateTime.Now});xxxxxxxxxxvar user = db.SingleDog<User>(4); // 或 user=db.Query<User>().Where(x => x.Id == 4).OneFirst()user.Name = "Tommy";user.UpdateTime = DateTime.Now;db.Save(user);xxxxxxxxxxdb.Delete<User>(1);xxxxxxxxxxdb.Delete<User>(x => x.IsDeleted == true);xxxxxxxxxxvar q = db.Query<User>() .Where(x => x.IsDeleted == false) .AndGroup(g => g .Where(x => x.CreateTime >= DateTime.Now.AddDays(-1)) .Where(x => x.CreateTime <= DateTime.Now) );Console.WriteLine(q.DebugWhereTree());输出示例:
xxxxxxxxxxAND [is_deleted] = @p0 AND ([create_time] >= @p0) ([create_time] <= @p0)xxxxxxxxxxstring sql = q.DebugSql();var parameters = q.DebugParameters();Animal ORM 并不是“脱离 ADO.NET 的黑盒 ORM”,而是完全构建在 ADO.NET 之上,对连接、命令、参数、事务都有清晰可控的封装。
xxxxxxxxxxpublic interface IAnimalDbConnection : IDisposable{ int ExeNQuery(string sql, IDbDataParameter[] paras = null); int ExeNQuery(string sql, object param = null); object ExeScalar(string sql, IDbDataParameter[] paras = null); object ExeScalar(string sql, object param = null); IDataReader ExeReader(string sql, IDbDataParameter[] paras = null); IDataReader ExeReader(string sql, object param = null); IDbDataAdapter ExeAdapter(string sql, IDbDataParameter[] paras = null); IDbDataAdapter ExeAdapter(string sql, object param = null);}说明:
IDbConnectionxxxxxxxxxxint rows = db.ExeNQuery("DELETE FROM sys_user WHERE is_deleted=1",null);等价于:
xxxxxxxxxxIDbCommand cmd = conn.CreateCommand();cmd.CommandText = "DELETE ...";rows = cmd.ExecuteNonQuery();xxxxxxxxxxint count = Convert.ToInt32(db.ExeScalar("SELECT COUNT(1) FROM sys_user",null));xxxxxxxxxx var sql = "select * from sys_user where id=@id"; var userList = db.ExeReader(sql,new { id = 1 }).ToListFast<User>(); xxxxxxxxxx var sql = "select * from sys_user where id=@id"; var dataAdapter = db.ExeAdapter(sql,new { id = 1 }); DataSet ds=new DataSet(); dataAdapter.Fill(ds);👉 你可以在 ORM 和纯 ADO.NET 之间自由切换。
xxxxxxxxxxtry{ db.OpenTrans(); //Begin Trans db.Add(new User { Name = "Tom", Password="123456", CreateTime=DateTime.Now, IsActive=true, IsDeleted=false }); db.ExeNQuery("UPDATE sys_user SET is_active=0 WHERE id=@id", new { id = 1 }); db.CommitTrans(); //Commit Trans}catch (Exception ex){ Console.Write(ex.Message); db.RollbackTrans(); //Rollback Trans}✔ ORM ✔ 原生 SQL ✔ 同一事务
xxxxxxxxxxTortoiseLog log=new TortoiseLog ();using (var db = AnimalDb.Create(connStr, provider, log)){ var list = db.Query<User>().ToList(); var sucess=log.Success; var currentSql=log.SuccessSql; List <string> sqlRecords=db.GetAllSqlRecords(); // or sqlRecords=log.SqlRecords} each sql json
xxxxxxxxxx{ "Success": "True", "Msg": "", "SQL": "INSERT INTO Person(Id,Name,Sex,Age,Birthday)values(@Id,@Name,@Sex,@Age,@Birthday)", "Paras": { "@Id": "1", "@Name": "Lilei", "@Sex": "1", "@Age": "24", "@Birthday": "2001/9/3 0:00:00" }}✔ ORM ≠ 屏蔽 ADO.NET
✔ Animal ORM = Query Builder + CRUD + ADO.NET 执行层
✔ 你可以随时降级为原生 SQL
✔ 适合:
2.NUGET 安装命令:
xxxxxxxxxxPM> Install-Package Animal.ORM.Core -Version 1.2.3
3.选择需要安装的数据库客户端:
xxxxxxxxxxPM> Install-Package System.Data.SqlClient -Version 4.6.1
xxxxxxxxxxPM> Install-Package MySql.Data -Version 8.0.17
xxxxxxxxxxPM> Install-Package Oracle.ManagedDataAccess.Core -Version 2.19.91
xxxxxxxxxxPM> Install-Package System.Data.SQLite.Core -Version 1.0.111
2.NUGET 安装命令:
xxxxxxxxxxPM> Install-Package Animal.ORM.Framework -Version 1.2.3
3.选择需要安装的数据库客户端:
不需要安装(Framework自带)
xxxxxxxxxxPM> Install-Package MySql.Data -Version 8.0.17
xxxxxxxxxxPM> Install-Package Oracle.ManagedDataAccess -Version 19.9.0
xxxxxxxxxxPM> Install-Package System.Data.SQLite -Version 1.0.112
文档完
联系QQ :455362030