Atitit.数据操作dsl 的设计 ---linq 方案

1.1. sql与api方式1

1.2. Linq方案与stream方案的选择,1

1.3. 前缀表达式 vs 中缀表达式1

1.4. 要不要字符串分隔符1

1.5. 尽可能的兼容sql标准2

1.6. 多数据源的支持2

1.7. 结论2

1.8. 最终结果如下2

1.1. sql与api方式

对于数据操作,目前常用的俩中方案sql与api方式,api里面又分为linq方案与stream方案。。

一下是他们的比较原则上,以人类可读性为优先。Sql的可读性是最强的,单他的机器可读性就是最差的。。。Api方式则相反,易于解析,牺牲了部分人类可读性,来换取方便的机器解析。。

Sql的解析比较困难,不太适合直接作为dsl来使用。。当然如果数据源是数据库的话,已经实现了sql的解析了,就可以使用sql作为dsl来使用了。。如果是其他的数据源比如list,就自己实现解析sql来查询list,就比较麻烦了。。

1.2. Linq方案与stream方案的选择,

linq是stream的特列。专门化的一种dsl,可读性更好,类似sql,而sql几乎作为实际操作的一种标准dsl,符合标准比较好,容易学习。。绝大部分场合下,应该使用linq方式。。

部分常见的数据结构,可以特化stream api来用,stream api有着更加灵活和简便的操作可以对特定操作。

作者::  ★(attilax)>>>   绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

1.3. 前缀表达式 vs 中缀表达式

Linq的实现模式有俩中,一种是api 前缀表达式模式,此种模式容易解析,单可读性稍微差点。  Api中缀表达式,容易解析,可读性强,但是,此类模式工作量庞大,一般使用机器生成,会带来同步维护性问题,放弃。。

1.4. 要不要字符串分隔符

Sql使用单偏好作为字符串分隔符,其他编程语言使用双引号,但是带来连解麻烦的问题。

考虑到可读性,以及机器解析的需要,反正以及分割的很小单位表达式了,容易解析的,就无需字符串分隔符了。。

1.5. 尽可能的兼容sql标准

1.6. 多数据源的支持

内存数据,string,list ,cache,nosql,文件,excel,数据库等均可以利用linq来查询与操作

1.7. 结论

所以折中考虑下,人类可读性优先考虑,但是开发简单性也要保证。。最终的比较好的方案就是在大操作上 from where等使用api函数模式,但里面的条件表达式等使用sql模式的文本中缀表达式模式,方便机器解析。。

1.8. 活动发起计划:

兄弟们,我们联合起来,搞个linq呀,我们的目标:

---多数据源的支持:内存数据,string,list ,cache,nosql,文件,excel,数据库等均可以利用linq来查询与操作

实现思路:先把linq里面的表达式简单词法分析,转换为全部的api函数式前缀表达式结构。构建ast,然后执行语法解析。。即可。。

1.9. 最终结果如下

List list=ListUtil.addMapFromStr(“name:李明,age:11”).addMapFromStr(“name:刘利,age:17”).toList();

List<Map> result_list= select(“name,age”).from(list).where(“name=李明”).and(“age>12”).orderby(“name,age desc”);

实现思路:先把linq里面的表达式简单词法分析,转换为全部的api函数式前缀表达式结构。构建ast,然后执行语法解析。。即可。。

Atitit.数据操作dsl 的设计 ---linq 方案的更多相关文章

  1. atitit.软件开发概念--过滤和投影 数据操作

    atitit.软件开发概念--过滤和投影 数据操作 投影的本质及扩展 物体在太阳光的照射下形成的影子(简称日影)就是平行投影.日影的方向可以反映时间 投影还比喻此物通过彼物表现出来的迹象. 作者::老 ...

  2. Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

    Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3.  ...

  3. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  4. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  5. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

  6. 初始ADO.NET数据操作

    以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...

  7. Atitit.导出excel功能的设计 与解决方案

    Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js  jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...

  8. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...

  9. C# 数据操作系列 - 8. EF Core的增删改查

    0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...

随机推荐

  1. 【系统自启动】使用windows自带工具管理开机启动项

    1.windows+R,键入:msconfig 2.进入启动选项卡 3.将不用自启动的选项 取消勾选即可 点击应用,重启电脑即可

  2. C++ Java C#泛型

    泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛 ...

  3. ATL7窗口类详细剖析

    前言: ATL是微软继MFC之后提供的一套C++模板类库,小巧.精妙.效率极高.它的主要作用是为我们编写COM/DOM/COM+程序提供了丰富的支持.但是ATL只能写COM么?我以前只是MFC程序员的 ...

  4. iOS中 xib自定义View在storyboard中的使用

    1,创建UIView 的SubClass 命名为MyView 2, new一个名为MyView的xib p1 3,配置xib的属性 p2 4,为View 添加背景色,添加一个按钮并定制按钮约束,这里我 ...

  5. iOS:iOS开发系列–打造自己的“美图秀秀”(上)

    来源: KenshinCui 链接:http://www.cnblogs.com/kenshincui/p/3959951.html 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功 ...

  6. iOS:CALayer锚点的使用

    CALayer层的位置主要和position和anchorPoint有关.其中它们在一起才能决定层在视图中的具体位置. @property CGPoint position;         //位置 ...

  7. python对于0x01的处理

    对于python脚本,可以使用: .replace('\x01', '') 对于vim工具,可以使用: :%s/\%x01/ /g

  8. 阿里云NAS使用方法

    1.创建文件系统 #在创建文件系统页面,填写各项参数.根据项目需求选择存储类型 2.添加挂载点 文件系统实例创建完成后,您需要为文件系统添加挂载点,用于计算节点(ECS 实例.E-HPC 或容器服务) ...

  9. Sqlite-Sqlite3中的数据类型

    大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的.刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列. Sqlite使用一个 ...

  10. 这里先发布一个,自己写得unityUI的适配的方案(插播)

    这个适配是依据坐标系的象限的思想来进项适配的.參考了部分的NGUI的适配方案. 在程序的事实上,来測量UI距离相机边界的像素然后依据比例来进行适配,个人认为还不错. 放码! . 有个前提哦就是你要先定 ...