輕量ORM-SqlRepoEx (十六)最佳實踐之Dapper(2)

a.thinker發表於2018-10-26

簡介: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等特性,為異構提供了簡易的操作;

 

 

相關文章