在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

ATK 设计框架 之 Atk.CustomExpression的更多相关文章

  1. ATK 设计框架辅助工具-代码生成器

    在 ATK框架代码中的示例,是用代码生成器生成的. 示例中有三个项目DemoTools.BLL 业务层,DemoTools.UIServer 前端服务层,DemoTools.WebUI 前端是ASP. ...

  2. Origami – 用于 Quartz 的免费的交互设计框架

    Origami 是一个为 Quartz Composer 开发的免费的工具包——由Facebook设计团队创建,让交互设计原型更加简单,不需要编程. 如今,大多数设计师通过创建静态原型来表达要实现的应 ...

  3. SOA之(2)——SOA架构基础概念与设计框架

    SOA的设计框架 设计框架与架构相关的概念紧密相连,原则.模式和架构始终是与设计共舞的. SOA服务设计的原则中记录了一个基础的设计框架: 设计特性(Design Characteristic)——由 ...

  4. 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)

    在我脑子里还没有Material Design这种概念,就我个人而言,PC端应用扁平化设计必须成为首选,手当其冲的两款即时通讯旺旺和QQ早就完成UI扁平化的更新,然而客户端扁平化的设计本身就存在天生的 ...

  5. Spark ML源码分析之一 设计框架解读

    本博客为作者原创,如需转载请注明参考           在深入理解Spark ML中的各类算法之前,先理一下整个库的设计框架,是非常有必要的,优秀的框架是对复杂问题的抽象和解剖,对这种抽象的学习本身 ...

  6. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

  7. ATK-DataPortal 设计框架(三)

    边界清晰.服务自治.契约共享.基于策略的兼容性,是面向对向设计时四个基本原则,我们的应用可能分布在不同的环境之中,应用可能在同一服务器中,也可能在不同的网络环境中,保证框架的基类能在不同环境中仍然可用 ...

  8. ATK-DataPortal 设计框架(二)

    在信息的交换过程中,总是有此相同相似的功能,由于业务的各自不同,由同一类型来处理诸如增删改查等常见的信息处理方式.从日常的对些类行为操作为生成的类分析,大量雷同的代码遍布整个项目.框架中xxxHand ...

  9. ATK-DataPortal 设计框架(一)

    无论是简单的还是复杂的框架,总需要一个开始的原点,ATK-DataPortal中包含了所有基础类的定义. 一.业务框架基础类 1.BusinessBase:所有业务类的根类,要使用ATK库的类,必需继 ...

随机推荐

  1. SpringBoot | 第二十七章:监控管理之Actuator使用

    前言 随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了.所以,本章节开始,开始讲解SpringBoot的监控相关 ...

  2. vscode插件推荐

    在扩展(Ctrl+Shift+X)中直接搜索这些插件的名字安装即可 1.HTML Snippets 超级使用且初级的H5代码片段以及提示 2.HTML CSS Support 让HTML标签上写cla ...

  3. java常用API之Calendar类

    Calendar是日历类,该类将所有可能用到的时间信息封装为静态成员变量,方便获取. Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言 ...

  4. html中通过移除空格的方法来解决浏览器上的留白间距该怎么理解?

    今天在切图的时候,碰到一个兼容性的问题,很幸运最后通过张金鑫老师的文章解决了这个问题!但在阅读张老师文章的时候,我有个地方不明白,在网上查了下也没找到我想要的答案,后来自己想了半天好像是这么回事,现在 ...

  5. win10下clodeblocks编译C语言乱码

    打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8

  6. js数组插入指定位置元素,删除指定位置元素,查找指定位置元素算法

    将元素x插入到顺序表L(数组)的第i个数据元素之前 function InsertSeqlist(L, x, i) { // 将元素x插入到顺序表L的第i个数据元素之前 if(L.length == ...

  7. PLC-Heart

  8. Android图片处理--全景查看效果

    PS:Android对于图片处理这块资源还是挺多的,之前用OpenGL制作图片的全景效果,耗时耗力,而且只能点击进去后看到,但是效果是非常的号,今天所写的是编写好的一个图片控件,只要拿来用就可以了.效 ...

  9. java实现链表结构详细代码

    一.数据准备 1. 定义节点 2.   定义链表 1.数据部分 2.节点部分 class DATA //数据节点类型 { String key; String name; int age; } cla ...

  10. 好记性不如烂笔头-nginx安装环境与Linux安装ftp组件

    Nginx安装环境 1. Nginx安装环境 Nginx是C语言开发,建议在linux上运行,我参加工作这些年来一直使用Linux发行版之一的 Centos作为安装环境. 1.1 gcc 安装Ngin ...