CRL 2.3.0.0
- CRL是一個面向對象的輕便型ORM業務框架
- 數據處理使用了對象/數據映射,采用Lambda表達式來表示條件查詢,增加了可編程性和可靠性,出錯機率低,同時也能用原生的SQL實現查詢或操作
- 數據連接以編程方式進行配置,支持多個庫,多種數據庫類型,參見Global.asax中實現,首次使用請更改LocalSqlHelper.CreateDbHelper中數據連接
- 通過業務對象封裝繼承,實現業務重用性,比較常用的封裝有,會員/賬戶系統,字典配置,分類系統,在線支付,訂單/購物車,權限驗證/菜單系統等等,當然也可以寫自已的業務封裝
- 開發效率:不需要額外工具生成,不需要繁瑣的拼接字符串,通過代碼復用,大大提高開發速度
- 運行效率:在對象映射上作了緩存處理,查詢效率幾乎等於手寫SQL效率,注:CRL對象查詢默認是 with(nolock)
- 緩存支持:光操作數據,沒緩存怎么能行? 通過對象緩存綁定,很輕松實現緩存創建和調用
通過內置分布式解決方案,輕松實現分布式緩存服務- 數據安全:所有標准查詢都經過參數化處理,無注入風險
- 動態編譯:數據表自動創建/動態存儲過程支持與查詢轉換,極大減少了數據庫維護工作,增加開發效率
- 關聯支持:2.2版支持多表關聯查詢,返回兩種結果,供不同場景使用,見[關聯查詢]示例
特點詳細示例:
- 新的開發模式(CodeFirst)
- 傳統開發需先設計表,再設計對象,CRL省略的這一步,直接設計對象,對象為主,數據表為輔,更符合面象向對象的開發模式
- 無需額外工具生成實體類,按標准方式寫即可,即寫即用,運行后自動創建對象對應數據表
- 新增加的對象屬性也不用上數據庫維護了,它會自動進行檢查創建
- 調用簡單 通過表達式查詢轉換為等效SQL語法,如:
繼承實現業務類 public class OrderManage : CRL.Order.OrderBusiness 對象操作不再需要傳入T對象類型 var order = OrderManage.Instance.QueryItem(b=>b.Id==1 && b.UserId==2); 等效為 select * from Order where id=1 and UserId=2 更新刪除同理
- 業務封裝控制 數據訪問對象不會直接暴露在外面,需要通過業務類才能實現操作,通過這個約束,限定業務必須在類務類實現,達到封裝的目的
public bool TransactionTest(out string message) { message = ""; var helper = dbHelper; helper.BeginTran(); try { helper.Delete(b => b.Id == 1); var item = new Code.ProductData() { InterFaceUser = "2222", ProductName = "product2", BarCode = "" }; helper.InsertFromObj(item); helper.CommitTran(); message = "事務已提交"; return true; } catch(Exception ero) { message = ero.Message + " 事務已回滾"; helper.RollbackTran(); } return false; }
- 緩存綁定 對任意基本查詢可作數據緩存處理,設置過期時間后自動更新緩存,或直接創建當前對象數據緩存
var query = Code.ProductDataManage.Instance.GetLamadaQuery();//創查完整查詢 query = query.Where(b => b.Id < 700); int exp = 10;//過期分鍾 var list = Code.ProductDataManage.Instance.QueryList(query, exp);//返回一個查詢緩存,條件不一樣,緩存也不一樣 調用對象數據緩存 var list = Code.ProductDataManage.Instance.QueryFromAllCache(b => b.Id < 700);//在內部緩存數據中查找
- 動態編譯(僅MSSQL) 將任意查詢/更新/刪除操作自動編譯為數據庫等效存儲過程,大大提高運行效率
var query = Code.ProductDataManage.Instance.GetLamadaQuery(); query = query.Where(b => b.Id < 700); string name = Request["name"]; query = query.Where(b => b.InterFaceUser == name); var list = Code.ProductDataManage.Instance.QueryList(query, compileSp: true); 將會創建並調用等效存儲過程 CREATE PROCEDURE [dbo].[ZautoSp_6B517FF62BDE99E6] (@id0 nvarchar(500),@InterFaceUser1 nvarchar(500)) AS set nocount on select t1.[AddTime],t1.[BarCode],t1.[CategoryName],t1.[Id],t1.[InterFaceUser],t1.[Number], t1.[ProductChannel],t1.[ProductId],t1.[ProductName],t1.[PurchasePrice],t1.[SoldPrice], t1.[Style],t1.[SupplierId],t1.[SupplierName],t1.[TransType] from ProductData t1 with(nolock) where (t1.Id<@Id0) and InterFaceUser=@InterFaceUser1
- 繼承使用業務封裝 通過繼承對象或業務類型,調用內置業務封裝或實現自已的業務封裝,增加開發效率
var user = new User(){Name="test"}; UserManage.Instance.Login(user,"user",false);//實現Form驗證登錄,並設定票據
- 多數據庫支持 通過實現數據庫適配器,實現多數據庫支持,詳見"支持數據庫詳細"
支持數據庫詳細:
數據庫 | 基本查詢 | 自動創建表 | with(nolock)查詢 | 批量插入 | 存儲過程 | 動態編譯存儲過程 | 自帶業務封裝 | 備注 |
MSSQL | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 需創建分頁sp_page_MSSql.sql 存儲過程 |
---|---|---|---|---|---|---|---|---|
MySQL | 支持 | 支持 | 不支持 | 不支持 | 支持 | 不支持 | 支持 | 需創建分頁sp_page_MySql.sql 存儲過程 |
ORACLE | 支持 | 支持(需高級權限) | 不支持 | 不支持 | 支持 | 不支持 | 部份支持 | 需創建分頁sp_page_ORACLE.sql 存儲過程 動態執行腳本 sp_ExecuteScript_ORACLE.sql |