zoukankan      html  css  js  c++  java
  • 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; }

    }

     

    ExpConditions<A> expa = new ExpConditions<A>();

    expa.AddAndWhere(s => s.Id == 123 && s.name.Contains("a"), Alias.a2);

    expa.UpdateFields(s => new { s.Id, s.sex }, Alias.a2);

     

    结果生成下列两个语句:

    1、Where (([a2].[Id] = 123) and ([a2].[name] LIKE '%' + 'a' + '%'))

    2、[a2].[Id] = @Id,[a2].[sexA] = @sex

    例2:

     

        // 当需要多子句拼接时,自动合并成合适的子句,如 Where ,不会出现多个“where”关键词。

        ExpConditions<A> expa2 = new ExpConditions<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

    也可发邮件至:azthinker@sina.com

    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

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/athinker/p/9695669.html
Copyright © 2011-2022 走看看