lambda2Graphql
js版本的Linq to Graphql
如何使用
npm i lambda2graphqljs
public Id: stringpublic Name: stringpublic Mobile: string// tslint:disable-next-line: max-classes-per-filepublic Users: User// 当作函数使用const code =// tslint:disable-next-line:no-consoleconsole/*{Users {Mobile,Name,Id}}*/// 封装成对象使用const lambda1 = <Db>aUsers// tslint:disable-next-line:no-consoleconsole/*{Users (Mobile = 1232323) {Mobile}}*/// 扩展方法使用const lambda: ILinqDb<Db> = aUsers// tslint:disable-next-line:no-consoleconsole/*{Users {Mobile,Name}}*/
设计思路
灵感来源于 C# 的 Linq to SQL
{idname}
The above GraphQL query could be translated to:
dbUsers;
这个接口返回不是立即执行的,而是一个表达式,最终会转化为sql语句给数据库 也就是说上面的c# 表达式跟sql语句是互相等价的,
如果这个换成js版本的就是:
dbUsers;
然后把sql 语句换成graphql字符
那能否把 js 函数语句 变回 graphql字符串呢?
首先,高阶函数包装
const linqExpress1 = {return dbUsers }
然后,通过 Function.toString() 获取 Native Code 分析表达式源码,转成真正的 graphql 语句
linqExpress1 // "() => { return db.Users.filter(u => u.Id === 4).map(a => { return { id:a.id } }) } "
AST代码转换
"() => { return db.Users.filter(u => u.Id === 4).map(a => { return { id:a.id } })}"
换成
{ id }
好处
- 受限的Lambda 的语句可读性强,更重要的是支持ts 泛型 静态类型检测
- 支持map 默认所有字段,不需要显示声明字段