Atitit.数据操作dsl 的设计 ---linq 方案
Atitit.数据操作dsl 的设计 ---linq 方案
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 方案的更多相关文章
- atitit.软件开发概念--过滤和投影 数据操作
atitit.软件开发概念--过滤和投影 数据操作 投影的本质及扩展 物体在太阳光的照射下形成的影子(简称日影)就是平行投影.日影的方向可以反映时间 投影还比喻此物通过彼物表现出来的迹象. 作者::老 ...
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle
Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq index2 3. ...
- Atitit 数据存储视图的最佳实际best practice attilax总结
Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论 本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
- MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题
1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...
- 初始ADO.NET数据操作
以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- C# 数据操作系列 - 8. EF Core的增删改查
0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置. 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法. 1 ...
随机推荐
- phaser框架制作游戏的例子,加上自己的注释
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hadoop-2.0.0-cdh4.6.0 安装
1.创建hadoop用户[所有操作都是root,在所有master和slaver上]1).创建hadoop用户:adduser hadoop2).更换密码:passwd hadoop========= ...
- Vue脚手架(vue-cli)搭建和目录结构详解
一.环境搭建 1.安装node.npm.webpack,不多说 2.安装vue-cli脚手架构建工具,打开命令行工具输入:npm install vue-cli -g,安装完成之后输入 vue -V( ...
- Spark Streaming资源动态分配和动态控制消费速率
本篇从二个方面讲解: 高级特性: 1.Spark Streaming资源动态分配 2.Spark Streaming动态控制消费速率 原理剖析,动态控制消费速率其后面存在一套理论,资源动态分配也有一套 ...
- 云计算之路-试用Azure:上不了高速的跑车,无法跨Cloud Service的DNS服务器
从阿里云的踩坑大师,到Azure的抹黑大师,我们似乎成了云计算负面用户的典型,可是我们还是忍不住想表达自己真实的使用感受.如果有错误的地方,欢迎大家批评! 在Azure上建好虚拟网(Vitual Ne ...
- 多媒体封装格式详解---MP4
MP4文件格式详解——结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...
- C/C++中传值和传地址(引用)
C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如: void swap_by_value(int a, int b) { in ...
- Linux启动apache失败怎么办
(20014)Internal error (specific information not available): AH00058: Error retrieving pid file logs/ ...
- Opengl ES 1.x NDK实例开发之六:纹理贴图
开发框架介绍请參见:Opengl ES NDK实例开发之中的一个:搭建开发框架 本章在第三章(Opengl ES 1.x NDK实例开发之三:多边形的旋转)的基础上演示怎样使用纹理贴图,分别实现了三角 ...
- struts2 常用标签
版权声明:本文为博主原创文章,未经博主允许不得转载. Struts2可以将所有标签分成3类: 准备工作:需要在JSP页面引入标签库 <%@ taglib prefix="s" ...