[LINQ2Dapper]最完整Dapper To Linq框架(一)---基礎查詢


此框架是Dapper的擴展,效率優於EntityFramwork,並且支持.NetFramework和.NetCore框架

支持.net framework4.5.1,.net core2.0及以上,更低版本適配如.netFramework4.0及以下請加群下載

支持Mssql,Oracle,Mysql等數據庫

     應用層需要引用包Kogel.Dapper.Extension.MsSql(如果數據庫是Oracle則引用Kogel.Dapper.Extension.Oracle),Nuget上可以下載安裝。

或者使用Nuget命令添加包

Install-Package Kogel.Dapper.Extension.MsSql

 

 

(一)Model實體類 

 實體類層需要安裝Kogel.Dapper.Extension表名字段特性。[更多特性詳情請點擊]

using Kogel.Dapper.Extension.Attributes;

 public class users
    {
        /// <summary>
        /// 用戶id(特性Identity標識該字段為主鍵)
        /// </summary>    
        [Identity]
        public int id { get; set; }

        /// <summary>
        /// code
        /// </summary>    
        public string code { get; set; }

        /// <summary>
        /// 用戶名稱
        /// </summary>    
        public string name { get; set; }

        /// <summary>
        /// 創建方式(1自定義角色 2通用角色)
        /// </summary>    
        public int createWay { get; set; }

        /// <summary>
        /// 創建時間
        /// </summary>    
        public DateTime createDate { get; set; }

        /// <summary>
        /// 創建人
        /// </summary>    
        public string createUsers { get; set; }

        /// <summary>
        /// 角色id
        /// </summary>    
        public int roleId { get; set; }
}

 

(二)使用實例

首先添加命名空間

using Kogel.Dapper.Extension.MsSql;

可以通過數據庫連接對象點出擴展方法,例如

var conn = new SqlConnection("數據庫連接字符串");

 

使用完記得釋放連接對象,可以通過using或者 conn.Dispose();


查詢

var users = conn.QuerySet<users>().Where(x => x.code != "1").Get();

 

模糊查詢

var users1 = conn.QuerySet<users>().Where(x => x.name.Contains("Y")).Get();

 

查詢一個數組條件

int[] array = new int[] { 1, 2, 3 };
//使用In
var comment = conn.QuerySet<Comment>().Where(x => x.Id.In(array)).ToList();
//或者使用Contains
var comment = conn.QuerySet<Comment>().Where(x => array.Contains(x.Id)).ToList();

 

使用sql查詢

DynamicParameters param = new DynamicParameters();
				param.Add("Id", 1);
var comment = conn.QuerySet<Comment>().Where("Id=@Id", param)
					.ToList();

 

范圍查找 

var comment = conn.QuerySet<Comment>().Where(x => x.Id.Between(1, 10)).ToList();

  

修改

var users=new users();          
users.name = Guid.NewGuid().ToString();
users.createDate = DateTime.Now;
int result = conn.CommandSet<users>().Where(x => x.id == 4).Update(users);
 

自定義修改(修改指定字段)

int result = conn.CommandSet<Comment>()
                    .Where(x => x.Content == "test")
                    .Update(x => new Comment
                    {
                        Content = "test1"
                    });

 

新增  

int result = conn.CommandSet<users>()
                 .Insert(new users() { 
                       code = Guid.NewGuid().ToString(), 
                       name = "test", createWay = 1, 
                       createDate = DateTime.Now, 
                       roleId = 2 
                 }); 

 

 新增返回自增Id

int result = conn.CommandSet<users>()
                 .InsertIdentity(new users() { 
                       code = Guid.NewGuid().ToString(), 
                       name = "test", createWay = 1, 
                       createDate = DateTime.Now, 
                       roleId = 2 
                 });

  

刪除

int result = conn.CommandSet<users>()
              .Where(x => x.roleId == 2 && x.name == users2.name)
              .Delete();

 

如果想使用事務

using (var conn = new SqlConnection(mysqlConnection))
{
                //必須先打開數據庫
                conn.Open();
                //創建事務對象
                var transaction = conn.BeginTransaction();
                //使用事務對象做修改
                var result = conn.CommandSet<Comment>(transaction)
                    .Where(x => x.Id.Equals(1))
                    .Update(x => new Comment()
                    {
                        Content = "test"
                    });
                //提交事務,回滾使用  transaction.Rollback();
                transaction.Commit();
}

  

連表查詢

Join<主表,副表>(主表關聯字段,副表關聯字段)

var list = conn.QuerySet<users>()
           .Where(x => x.code != "1")
           .Join<users, project_Role>(x => x.roleId, y => y.id)
           .ToList();

  

任意條件連表

var list = conn.QuerySet<users>()
           .Where(x => x.code != "1")
           .Join<users, project_Role>((x,y)=>x.roleId==y.id)
           .ToList();

  

還可以設置連表的方式(默認是Left Join)

var list = conn.QuerySet<users>()
           .Where(x => x.code != "1")
           .Join<users, project_Role>((x,y)=>x.roleId==y.id, JoinMode.LEFT)
           .ToList();

  

連表查詢可以渲染成指定實體類,例如動態類型(dynamic)

var list = conn.QuerySet<users>()
           .Where(x => x.code != "1")
           .Join<users, project_Role>(x => x.roleId, y => y.id)
           .ToList<dynamic>();

 

 

翻頁查詢

//翻頁查詢第一頁,10條數據
var list = conn.QuerySet<users>()
           .OrderBy(x => x.createDate)
           .PageList(1, 10);

//翻頁連表查詢返回dynamic
var list1 = conn.QuerySet<users>()
            .Join<users, project_Role>(x => x.roleId, y => y.id)
            .OrderBy(x => x.createDate)
            .PageList<dynamic>(1, 10);

 

多表任意聯查         

 var users = conn.QuerySet<users>()
                        .Join<users, project_Role>((a, b) => a.roleId == b.id)
                        .Where<users, project_Role>((a, b) => a.id == 3 && b.id == 3)
                        .Get<dynamic>();

 

3.14版本后Where函數和匿名返回類型支持比較復雜的函數判斷

例如

var comment1 = conn.QuerySet<Comment>()
                    .Join<Comment, News>((a, b) => a.ArticleId == b.Id)
                    .Where(x => x.Id.Between(80, 100)
                    && x.SubTime.AddDays(-10) < DateTime.Now && x.Id > 10
                    && x.Id > new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id < 3 && x.Id<y.Id).Sum<News>(y => y.Id)
                    )
                    .From<Comment, News>()
                    .OrderBy<News>(x => x.Id)
                    .PageList(1, 1, (a, b) => new
                    {
                        test = new List<int>() { 3, 3, 1 }.FirstOrDefault(y => y == 1),
                        aaa = "6666" + "777",
                        Content = a.Content + "'test'" + b.Headlines + a.IdentityId,
                        bbb = new QuerySet<Comment>(conn, new MySqlProvider())
                                .Where(y => y.ArticleId == b.Id && y.Content.Contains("test")).Sum<Comment>(x => x.Id),
                        ccc = a.IdentityId,
                        ddd = Convert.ToInt32("(select count(1) from Comment)"),
                        a.Id
                    });  

 

需要讀取數據庫的支持Sum和Count函數

不需要讀取數據庫的函數都支持,例如

 test = new List<int>() { 3, 3, 1 }.FirstOrDefault(y => y == 1)

  

批量新增

int result = conn.CommandSet<Comment>().Insert(commentList);  

以上操作都支持異步

 

3.1.8版本支持自定義導航查詢

	var ContentList = conn.QuerySet<Comment>()
					 .ToList(x => new CommentDto()
					 {
						 Id = x.Id,
						 ArticleIds = x.ArticleId,
						 count = new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id == x.ArticleId).Count(),
						 NewsList = new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id == x.ArticleId).ToList(y => new NewsDto()
						 {
							 Id = y.Id,
							 Contents = y.Content
						 }).ToList()
					 });

(子屬性返回暫時不支持匿名類)

(Dto類需要繼承 IBaseEntity

 

(三)擴展的一些函數處理

Kogel.Dapper支持一些基礎的sql函數 

 

 

 以及時間函數在不同數據庫中的處理

 

 

還有字符的轉換處理

 

 (四)分組聚合

3.1.9.3版本后支持分組聚合查詢

        var commne = conn.QuerySet<Comment>()
                    .Where(x => x.Id > 0 && array1.Contains(x.Id) && x.Content.Replace("1", "2") == x.Content)
                    .Where(x => x.Id.In(array1))
                    .GroupBy(x => new { x.ArticleId })
                    .Having(x => Function.Sum(x.Id) >= 5)
                    .ToList(x => new
                    {
                        x.ArticleId,
                        test1 = Function.Sum(x.Id)
                    });

通過Function類點出函數,例如Function.Sum(字段)

 

 

 更多擴展敬請期待

 

Kogel.Dapper還支持linq和sql同時使用

已完成更加復雜查詢條件或者連表關系,[詳情請點擊此處]

 

框架開源,完整框架源碼可以去Github上下載:

https://github.com/a935368322/Kogel.Dapper.Extension

如有問題也可以加QQ群討論:

技術群 710217654



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM