欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

轻量ORM-SqlRepoEx (十六)最佳实践之Dapper(2)

程序员文章站 2022-06-30 13:31:00
SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM。解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程序员来说,是非常简单的,其语法特点与Linq to Sql极为相似。不仅实现了完整的Select、Inse... ......

简介:sqlrepoex是 .net平台下兼容.net standard 2.0人一个轻型的orm。解决了lambda转sql语句这一难题,sqlrepoex使用的是lambda表达式,所以,对c#程序员来说,是非常简单的,其语法特点与linq to sql极为相似。不仅实现了完整的select、insert、update、delete等语句解析器,同时,也实现了select、where、order by等子句,这些语句与子句均支持导出sql语句,使得拼接复杂场景sql语句变得轻松,sqlrepoex很快其原生数据访问与dapper不相上下,sqlrepoex本身支持sql server与mysql方言,同时通过sqlrepoex.normal支持非方言sql。sqlrepoex没侵入性,仅通过简单的几个特性,就能让类与数据库关联起来;

 

*本系列以静态工厂为例;

*数据来源于northwind数据库;

*完整的代码见 https://github.com/azthinker/sqlrepoex2.0startguid  https://gitee.com/azthinker/sqlrepoex2.0startguid

 

五、@ 参数构建

1、对于类属性 ,sqlrepoex 为iinsertstatement,iupdatestatement提供了 paramsql()方法和 paramsqlwithentity()方法

(1)、 paramsql(),是一个简单返回参数语句的方法

var repository = mssqlrepofactory.create<azproducts>();

            var resultupdate = repository

                                    .update()

    // 注意此处的 paramset 方法,此时不需要指定属性的值

    // 这为构建完全的  @ 参数 提供了方便

    // 特别是在批更新时,最为方便

                                    .paramset(p => p.productname2, p => p.categoryid)

                                    .where(p => p.productid == p.productid);

            console.writeline(resultupdate.paramsql());

 此句会生成

update [dbo].[products]

set productname  = @productname2, categoryid  = @categoryid

where (([dbo].[products].[productid] = @productid));

    // 使用 dapper 更新

   azproducts products = new azproducts() { productid = 84, productname2 = "testvalue100", categoryid = 7 };

   //  dapper 更新

   int result = dbconnection.execute(resultupdate.paramsql(), products);

 

(2) paramsqlwithentity()方法,一个返tupe (string paramsql, tentity entity)

 

            var repository = mssqlrepofactory.create<azproducts>();

            var resultupdate = repository

                                    .update()

    // 此处使用 set 方法,并将属值指定

                                    .set(p => p.productname2, "testvalue234")

                                    .set(p => p.categoryid, 5)

                                    .where(p => p.productid == 84);

            var ret = resultupdate.paramsqlwithentity();

            console.writeline(ret.paramsql);

 

 此句会生成

update [dbo].[products]

set productname  = @productname2, categoryid  = @categoryid

where (([dbo].[products].[productid] = 84));

同时 set 方法中的属值会生在一个 azproducts 类实例,这样为使用 dapper提供了方便

  int result = dbconnection.execute(ret.paramsql, ret.entity);

 

 2、对于条件语句的  @ 参数

 条件语句中,只需要使用

 

 形如:.where(p => p.productid == p.productid); 即可产生  where (([dbo].[products].[productid] = @productid));

 参见上例 1 (1)

 

总结:

1、对于与dapper结合使用,sqlrepoex提供了两种方式,一种是使用 sqlrepoex.adapter.dapper ,采用与其他sqlrepoex的操作一至的方式来访问数据;二是,采用《最佳实践之dapper》中的方式,以sql语句结合dapper来操作;两种方式可同时并存,不影响使用,具体采用哪形式,由编程人员自行决定。

2、 sqlrepoex提供了以lamdba的方式 ,其操作类似于linq的操作,但更接近于sql本身的语义顺序

3、参数字段的构建非常方便,减少拼接语句容易出错问题,同时使用 table,column等特性,为异构提供了简易的操作;