ATK 設計框架 之 Atk.CustomExpression
在ATK-DataPortal框架中的xxxHandel中常用到的一種型別,形如:
1、protected virtual D ItemHandle(D item, Func<E, E> dataportalhandle, ExpConditions<D> znexp)
{
E bllitem = item.CopyToIn();
ApplyContext(bllitem);
bllitem.Criteria = BusinessCriteria.BusinessCriteriaCreate(znexp);
bllitem = dataportalhandle(bllitem);
return item.CopyToOut(bllitem);
}
2、 public ExpConditions<D> GetExp()
{
return new ExpConditions<D>();
}
以上兩例中的 ExpConditions<D> 是定義在 Atk.CustomExpression庫中。ExpConditions<D>是一個Lambda表示式轉SQL語句的功能類。
在分散式環境中,資料層到業務層的訪問往往需要在不同物理層中傳輸。在.NET中常見的ORM是EF,EF的功能和優點不在本文描述之內,EF本現一程序中傳遞時,是沒有任何問題的,但在不同物理層中,需要通過WCF之類的服務來傳輸時,問題就顯而易見,EF的序列化和反序列化在WCF不易實現,同時在多層設計中,前端的型別過重的傳入到資料層也是不合理的,容易形成強繫結,不合符分佈設計中服務自治原則。如果不能解決好跨程序跨服務問題,應用就很可能是常見的三層結構,且前後端存在型別強繫結。我們習慣用強型別來程式設計,這樣在型別檢查、變更時會有很大的使得。
Atk.CustomExpression庫能將將我們在前端所使用的Lambda表示式轉SQL子句。SQL子句是string類,這樣在序列化和反序列化就變得很容易,只要我們的資料層支援支援使用SQL來操作作數,EF和System.Data.SqlClient都是支援執行原始sql語句操作的。
Atk.CustomExpression庫
一、可以達到的功能
本功能類庫主要提供給程式碼中使用Lambda表示式,後需轉成SQL的條件語句這一需求
二、不能做的
1、本類庫不能解析Linq語句
2、不能解析SQL中的Select部分
例1:
class A
{
public Int16 Id { get; set; }
public string name { get; set; }
public string sex { get; set; }
}
AtkExpConditions<A> expa = new AtkExpConditions<A>();
expa.AddAndWhere(s => s.Id == 123 && s.name.Contains("a"), AtkAlias.a2);
expa.UpdateFields(s => new { s.Id, s.sex }, AtkAlias.a2);
結果生成下列兩個語句:
1、Where (([a2].[Id] = 123) and ([a2].[name] LIKE '%' + 'a' + '%'))
2、[a2].[Id] = @Id,[a2].[sexA] = @sex
例2:
// 當需要多子句拼接時,自動合併成合適的子句,如 Where ,不會出現多個“where”關鍵詞。
// When multiple clauses are required to be spliced,
// they are automatically merged into appropriate clauses,
// such as Where, without multiple "Where" keywords.
AtkExpConditions<A> expa2 = new AtkExpConditions<A>();
if (1==1)
{
expa2.AddAndWhere(s => s.Id == 123);
}
if (2==2)
{
expa2.AddAndWhere(s => s.name.Contains("a"));
}
結果生成下列兩個語句:
Where ([a0].[Id] = 123) And ([a0].[name] LIKE '%' + 'a' + '%')
----
ATK
1、一個完整支援分散式服務框架;
2、程式碼生成工具,可快速生成基於服務框架的應用;
3、其他支援庫
4、完整程式碼可在GitHub的https://github.com/azthinker ;開源中國 https://gitee.com/azthinker
目標:使應用開發,低程式碼、高效率、快迭代
有興趣的請在QQ群中參與討論、聯絡作者 QQ群名稱:ATK高效開發 ,QQ群號:747049962
也可發郵件至:[email protected]
Demo中的資料庫、編譯好的程式碼工具連結:https://pan.baidu.com/s/1B9RQm7_-SFyhLb_HLIGs0w 密碼:85q6
ATK Demo使用的資料庫 : https://download.csdn.net/download/xftyyyyb/10675497
ATK自動程式碼工具 :https://download.csdn.net/download/xftyyyyb/10675490