【ASP.NET程序員福利】打造一款人見人愛的ORM(二)

上一篇我已經給你們介紹AntORM的框架【ASP.NET程序員福利】打造一款人見人愛的ORM(一),今天就來着重介紹一下如何使用這套框架html

1>AntORM 全部成員

若是你只想操做一種數據庫,能夠針對不一樣數據庫選擇獨立的dll程序員

Asp.net 4.+sql

說明數據庫

依賴oracle

Ant.ORM.dll框架

負責實體和數據庫之間解析  post

Ant.Data.dllgradle

Ant.Data.dllspa

數據庫訪問層 .net

MySql.Data.dll

System.Data.SQLite.dll

Oracle.ManagedDataAccess.dll

SQLite.Interop.dll

Ant.Common.dll

 公共組件

 無

 

 

 

 

 

 

 

 

 

2>數據庫鏈接

1.普通模式

     這種模式簡單粗爆,適合一個產品支持多種數據庫,可是中間沒有兩種數據庫同時操做。

      

      

 

     在用數據庫鏈接的時候這兩個名稱要同樣才能讀取數據庫配置信息

 

2.靈活模式

     適合多種數據庫混用項目

     

     

       從上面圖中能夠看出,能夠支持讀寫庫進行配置分離。

 

3.數據庫配置

 1   <AppSettings>
 2     <DatabaseName>antormsqlite</DatabaseName>
 3     <DatabaseType>mssql</DatabaseType>
 4     <!--oledb:Access數據庫;mssql:SQL數據庫;oracle:oracle數據庫;SQLite:SQLite小型數據庫-->
 5     <IsConStringEncrypt>true</IsConStringEncrypt>
 6     <DatabaseKey>A949564832391559D9994800BB8F283D8FB44CCE5FAA0246574C4A247C39F2B2DA3425F0B23582C13BC5FDAD2AED1A33</DatabaseKey>
 7     <ReadData>user id=sa;password=a1b2c3d4@admin;DataBase=OOExceptionHandle;server=1.41.107.147;</ReadData>
 8     <!--1.41.107.147-->
 9     <WriteData>user id=sa;password=a1b2c3d4@admin;DataBase=OOExceptionHandle;server=1.41.107.147;</WriteData>
10   </AppSettings>

  

 

3>增刪查改多表操做以及事務

  項目中用到的實體:

 

 1     public enum Gender
 2  { 3 Man = 1, 4  Woman 5  } 6 7 [Table("Users")] 8 public class User : BaseEntityObj 9  { 10 public User() 11  { 12 13  } 14 15 [Column("id", IsPrimaryKey = true), AutoIncrement] 16 public int? Id { get; set; } 17 18 private string name; 19 public string Name 20  { 21 get { return name; } 22 set { name = value; } 23  } 24 public Gender? Gender { get; set; } 25 private int? age; 26 public int? Age 27  { 28 get { return age; } 29 set { age = value; } 30  } 31 public int? CityId { get; set; } 32 public DateTime? OpTime { get; set; } 33 34 }

 

1.AntORM實現查詢

  查詢單一實體方法一

 1             using (AntORM orm = new AntORM())
 2             {
 3 
 4                 orm.db = DataAccessFactory.CreateDataConnection("antormsqlite");//SQLite
 5                 orm.ModuleName = "antormsqlite";//SQLite
 6                 var q = orm.Queryable<User>();
 7                 RequestModel rest = new RequestModel();
 8                 rest.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢用戶信息單個實體方法" };
 9                 var mod = q.Where(a => a.Id == 12).FirstOrDefault();
10                 if (mod.IsSuccess)
11                 {
12                     User user = mod.ResultModel;
13                 }
14              }

  查詢單一實體方法二

 1            using (AntORM orm = new AntORM())
 2             {
 4                 var request = new RequestModel();
 5                 request.db = DataAccessFactory.CreateDataConnection("antormsqlite");
 6                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢菜單的單個實體方法" };
 7                 User query = new User();
 8                 query.Id = 5;
 9                 var reslut = orm.GetEntity(query, request);
10                 if (reslut.IsSuccess)
11                 {
12                     User user = reslut.ResultModel;
13                 }
14             }

 若是隻能通主鍵去查詢,還能夠這樣寫

 1            using (AntORM orm = new AntORM())
 2             {
 3                var  request = new RequestModel();
 4                 request.db = DataAccessFactory.CreateDataConnection("antormsqlite");
 5                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢菜單的單個實體方法" };
 6                 request.Oid = "5";
 7                 var res = orm.GetEntity<User>(request);
 8                 if (res.IsSuccess)
 9                 {
10                     User user = res.ResultModel;
11                 }
12             }

 查詢帶分頁方法一

 1            using (AntORM orm = new AntORM())
 2             {
 3                 RequestModel request = new RequestModel();
 4                 request.db = DataAccessFactory.GetWriteDataDefault;
 5                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢菜單的單個實體方法" };
 6                 var q = orm.Queryable<User>();
 7                 //分頁
 8                 var relust = q.Where(a => a.Id > 0).OrderBy(a => a.Age).ThenByDesc(a => a.Id).Top(10).Skip(1).ToList(request);
 9                 if(relust.IsSuccess)
10                 {
11                     var userlist = relust.ResultModel;
12                 }
13             }

查詢帶分頁方法二

 1             using (AntORM orm = new AntORM())
 2             {
 3                 RequestModel request = new RequestModel();
 4                 request.ModuleName = "antormsqlite";
 5                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢菜單的單個實體方法" };
 6                 User query = new User();
 7                 query.CityId = 2;
 8                 var reslut = orm.GetPageList(query, request);
 9                 if (reslut.IsSuccess)
10                 {
11                     var userlist = reslut.ResultModel;
12                 }
13             }

多表查詢的方法

 1             using (AntORM orm = new AntORM())
 2             {
 3                 orm.db = DataAccessFactory.GetWriteDataDefault;
 4                 var users = orm.Queryable<User>();
 5                 var cities = orm.Queryable<City>();
 6                 var provinces = orm.Queryable<Province>();
 7                 //創建鏈接
 8                 var user_city = users.InnerJoin(cities, (user, city) => user.CityId == city.Id && user.Id > 0);
 9                 var user_city_province = user_city.InnerJoin(provinces, (user, city, province) => (city.ProvinceId == province.Id));
10 
11                 RequestModel request = new RequestModel();
12                 request.db = DataAccessFactory.GetWriteDataDefault;
13                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查出一個用戶及其隸屬的城市和省份的全部信息三張表數據都返回出來" };
14                 var reslut = user_city_province.Select((user, city, province) => new { Users = user, Citys = city, Provinces = province })
15                     .Where(a => a.Users.Id == 3 && a.Citys.Name == "30").OrderByDesc(p => p.Users.Id).ToList(request);
16                 if(reslut.IsSuccess)
17                 {
18                     var userlist = reslut.ResultModel;
19                 }
20             }

 實現查詢帶In操做

 1             using (AntORM orm = new AntORM())
 2             {
 3                 orm.db = DataAccessFactory.CreateDataConnection("antormsqlite");
 4                 RequestModel request = new RequestModel();
 5                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "查詢用戶名稱帶這幾我的實現In操做的方法" };
 6                 string[] Names = { "lu", "jjg1", "jjg3" };
 7                 var reslut = orm.Queryable<User>().Where(p => Names.Contains(p.Name)).Select(p => new { p.Name, p.CityId }).ToList();
 8                 if (reslut.IsSuccess)
 9                 {
10                     var mod = reslut.ResultModel;
11                 }
12             }

 經過orm拼接條件來查詢

 1             using (AntORM orm = new AntORM())
 2             {
 3                var request = new RequestModel();
 4                 request.db = DataAccessFactory.GetWriteDataDefault;
 5                 request.newSt = new SqlNote() { Author = "季健國", NewSt = new System.Diagnostics.StackTrace(true), SqlDesc = "經過拼接條件來查詢的方法" };
 6                 User m = new User();
 7                 m.Age = 20;
 8                 IList<IPredicate> predList = new List<IPredicate>();
 9                 var query1 = Predicates.QueryField<User>(p => p.CityId, Operator.Equal, "1");
10                 predList.Add(query1);
11                 var query2 = Predicates.QueryField<User>(p => p.CityId, Operator.Equal, "1");
12                 predList.Add(query2);
13                 IPredicateGroup query = Predicates.SqlGroup(GroupOperator.And, predList.ToArray());
14                 request.Predicate =query;
15                 var reslut = orm.GetDr2EnList(m, request);
16                 if (reslut.IsSuccess)
17                 {
18                     var modlist = reslut.ResultModel;
19                 }
20             }

 經過自定義SQL查詢操做

 1         /// <summary>
 2         /// 自定義SQL操做
 3         /// </summary>
 4         /// <param name="request"></param>
 5         /// <returns></returns>
 6         public static ResponseModel AntOrmItemSQL(RequestModel request)
 7         {
 8             ResponseModel reslut = new ResponseModel();
 9             using (AntORM orm = new AntORM())
10             {
11                 int id = 1;
12                 orm.ModuleName = "antormsqlite";
13                 var list = orm.SqlQuery<User>(string.Format("select top {0} * from Users where Id>@Id", 1), new { Id = id }).Select(p => new { p.Name }).ToList();
14                 if (list.IfNotNull() || list.Count > 0)
15                 {
16                     reslut.ResultModel = list;
17                     reslut.IsSuccess = true;
18                 }
19                 return reslut;
20             }
21         }

實現分組查詢

 1         /// <summary>
 2         /// 分組查詢
 3         /// </summary>
 4         /// <param name="request"></param>
 5         /// <returns></returns>
 6         public static ResponseModel GroupQuery(RequestModel request)
 7         {
 8             using (AntORM orm = new AntORM())
 9             {
10                 var q = orm.Queryable<User>();
11 
12                 IGroupingQuery<User> g = q.Where(a => a.Id > 0).GroupBy(a => a.Age);
13 
14                 g = g.Having(a => a.Age > 1 && AggregateFunctions.Count() > 0);
15 
16                 var res = g.Select(a => new
17                 {
18                     a.Age,
19                     Count = AggregateFunctions.Count(),
20                     Sum = AggregateFunctions.Sum(a.Age),
21                     Max = AggregateFunctions.Max(a.Age),
22                     Min = AggregateFunctions.Min(a.Age),
23                     Avg = AggregateFunctions.Average(a.Age)
24                 }).ToList(request);
25                 return res;
26             }
27         }

2.AntORM實現新增修改刪除操做

 1         /// <summary>
 2         /// 實現保存操做
 3         /// </summary>
 4         public static ResponseModel UserSave(RequestModel request)
 5         {
 6             User mod = new User();
 7             using (AntORM orm = new AntORM())
 8             {
 9 
10                 orm.db = DataAccessFactory.CreateDataConnection("antormsqlite");//SQLite
11 
12                 var reslut = orm.Queryable<User>().Where(p => p.Id == 5).FirstOrDefault();
13                 if (reslut.IsSuccess)
14                 {
15                     mod = reslut.ResultModel;//實現的修改
16                 }
17                 else
18                 {
19                     mod = new User() { Name = "jjg4", Age = 30, Gender = Gender.Man, CityId = 2, OpTime = DateTime.Now };//實現的新增
20 
21                 }
22                 //第一種保存
23                 reslut = orm.SaveHaveNull(mod, request);//保存數據(新增和更新)數據庫沒有Null值
24                 //return reslut;
25 
26                 //第二種保存reslut
27                 reslut = orm.Save(mod, request);//根據實體來進行插入數據庫的表中帶Null值
28                 return reslut;
29 
30             }
31         }

 

        /// <summary>
        /// 批量更新操做
        /// </summary>
        public static ResponseModel Update(RequestModel request)
        {
            ResponseModel reslut = new ResponseModel();
            orm.db = DataAccessFactory.CreateDataConnection("antormsqlite");//SQLite
            using (AntORM orm = new AntORM())
            {
                #region 第一種更新方法
                reslut = orm.UpdateByLambda<User>(a => new User() { Name = a.Name, Age = a.Age + 100, Gender = Gender.Man, OpTime = DateTime.Now }, a => a.Id == 1, request);
                return reslut;
                #endregion
                #region 第二種更新方法 
                User user = new User();
                user.Name = "ljjgu";
                user.Age = 30;
                user.Gender = Gender.Woman;
                user.OpTime = DateTime.Now;
                reslut = orm.UpdateById(user, request);//會更新全部映射的字段 
                if (reslut.IsSuccess)
                { //更新成功 } 
                    #endregion
                    #region 第三種更新方法 /* * 支持只更新屬性值已變的屬性 */ 
                    user = new User();
                    user.Name = "ljjgu";
                    user.Age = 30;
                    user.Gender = Gender.Woman;
                    user.OpTime = DateTime.Now;
                    orm.TrackEntity(user);//這時只會更新被修改的字段 //在上下文中跟蹤實體 
                    user.Name = user.Name + "1";
                    reslut = orm.UpdateByLambda(user, a => a.Id == 2, request);
                    #endregion
                    #region 第四種更新方法批量更新 //批量更新 //給全部女性年輕 10 歲 
                    reslut = orm.UpdateByLambda<User>(a => new User() { Age = a.Age - 10, OpTime = DateTime.Now }, a => a.Gender == Gender.Woman, request);
                    if (reslut.IsSuccess)
                    { //更新成功 } 
                        #endregion
                    }
                }
            }
        }

  

 

 

        /// <summary>
        /// 刪除操做
        /// </summary>
        public static ResponseModel Delete(RequestModel request)
        {
            using (AntORM orm = new AntORM())
            {
                #region 第一種刪除方法

                var reslut = orm.DeleteByLambda<User>(a => a.Id == 1, request);
                
                #endregion

                #region 第二種刪除方法
                //批量刪除
                //刪除全部不男不女的用戶
                reslut= orm.DeleteByLambda<User>(a => a.Gender == null, request);
                #endregion

                #region 第三種刪除方法
                User user = new User();
                user.Id = 1;
                reslut=orm.DeleteByModel(user, request);

                return reslut;
                #endregion

            }
        }

  

3.AntORM實現事務操做

 1     /// <summary>
 2         /// 實現事務要保證數據庫鏈接db是同一個,不能從新建立新的數據庫鏈接
 3         /// </summary>
 4         public static ResponseModel CommitTransaction(RequestModel request)
 5         {
 6             User mod = new User();
 7             using (AntORM orm = new AntORM())
 8             {
 9 
10                 using (orm.db = DataAccessFactory.CreateDataConnection("antormsqlite"))//SQLite
11                 {
12                     orm.db.BeginTransaction();
13                     try
14                     {
15                         User query = new User();
16                         query.Id = 5;
17                         var reslut = orm.GetEntity(query, request);
18                         if (reslut.IsSuccess)
19                         {
20                             mod = reslut.ResultModel;//實現的修改
21                             reslut = orm.Save(mod, request);//保存數據(新增和更新)數據庫沒有Null值
22                             reslut = orm.DeleteByModel(query, request);
23 
24                         }
25                         else
26                         {
27                             reslut.IsSuccess = false;
28                             reslut.Message = "查詢數據失敗";
29                         }
30                         orm.db.Commit();
31 
32                         return reslut;
33                     }
34                     catch (Exception ex)
35                     {
36                         orm.db.RollBack();
37                         ResponseModel reslut = new ResponseModel();
38                         reslut.IsSuccess = false;
39                         reslut.Message = "事務中執行報錯" + ex.ToString();
40                         return reslut;
41                     }
42 
43                 }
44             }
45         }
相關文章
相關標籤/搜索