1. 程式人生 > >ATK 設計框架 之 Atk.CustomExpression

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