- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
为什么要写,大概就是沉没成本吧 。
只是从Source Generators出来开始,就打算以其研究是否能做 aop (现在已经有内置功能了),本来当年就想尝试能否在 orm 做一些尝试,可惜种种原因,自己都忘了这个打算了 。
直到今年7月份,才又想起了这个打算,现在精力不行了,本来研究一下原理和功能限制也算完了, 。
可是都写了蛮久了,不写完整点,感觉有点浪费,又花了不少时间才把 类似 DapperAOT 功能做的差不多 。
写完了又觉得光复制复制功能 没意思, 所以又把以前为了在公司内少写一些比较重复性代码做的 查询定制功能 在 sv.db 基础上搞一把, 反正成本已经花了那么多了 。
虽然这也不算多大创新, 类似想法老早就不少人搞了,比如最夸张的 graphql 这一套甚至让大家的基础设施都得搭一套, 。
不过越搞越多,都到国庆了,目前还只能算主体完成了,细节还有很多没搞 。
很多转换 解析都是手写的,不是因为写的nb,只是引入其他库兼容可能有点麻烦,场景不多,递归遍历就够了 。
nuget 什么的也没空搞了,bug 估计不少,等后面再完整点再搞,反正都是自娱自乐 。
真是年纪大了,做什么都越来越慢了 。
像 DapperAOT 一样,使用 Source Generators 在构建期间生成必要的代码,以帮助您更轻松地使用 sql.
理论上,您还可以进行 Native AOT 部署 。
其实没什么,举个栗子吧 。
public async Task<object> OldWay()
{
var a = factory.GetConnection(StaticInfo.Demo);
using var dd = await a.ExecuteReaderAsync("""
SELECT count(1)
FROM Weather;
SELECT *
FROM Weather;
""");
var t = await dd.QueryFirstOrDefaultAsync<int>();
var r = await dd.QueryAsync<string>().ToListAsync();
return new { TotalCount = t, Rows = r };
}
通过定义一些简单的查询规则,我们可以将 查询转换为 db / api / es 查询语句 .... 。
目前只搞了 db 转换,并且还没空完整适配测试, es 、mongodb 什么等后面有空把 。
不过理论上,我们可以这样做:
http query string / body |------> select statement |------> db (sqlite / mysql/ sqlserver / PostgreSQL)
Expression code |------> |------> es
|------> mongodb
|------> more .....
中间 select statement 这一层已经定义好了,前面的转换也有了, 后面的理论加上适配,什么都可以做, 。
首先定义一个 实体配置, 列明哪些字段可以查,可以排序,可以筛选 。
[Db("Demo")]
[Table(nameof(Weather))]
public class Weather
{
[Select, Where, OrderBy]
public string Name { get; set; }
[Select(Field = "Value as v"), Where, OrderBy]
public string V { get; set; }
[Select(NotAllow = true)]
public string Test { get; set; }
}
然后定义 查询接口 。
[HttpGet]
public async Task<object> Selects() // 你可以自己做一些字段,授权检查 [FromQuery, Required] string name)
{
return await this.QueryByParamsAsync<Weather>();
}
接着你就可以让用户自己拼写各种条件,让她们自己满足自己的场景,这样自己可以多摸一会鱼了 。
curl --location 'http://localhost:5259/weather?where=not (name like '%e%')&TotalCount=true'
Response 。
{
"totalCount": 1,
"rows": [
{
"name": "H",
"v": "mery!"
}
]
}
其实很多 orm 都提供用Expression 达到类似或更复杂效果的 。
这里考虑工作量,restful api 和其他数据查询实现 支持度不一,目前只做基础filter 支持, join 什么都不搞了,就算搞了多半又会被骂,直接写sql 不更好吗?
比如下面 query Weather which name no Contains 'e' 。
public async Task<object> DoSelects()
{
return await factory.ExecuteQueryAsync(From.Of<Weather>().Where(i => !i.Name.Like("e")).WithTotalCount());
}
这里就非常简单介绍一下,复杂的,怎么实现的不写,累了,写不动了,要有感兴趣的 可以在 gayhub 看源码 https://github.com/fs7744/sv.db 。
Both has func support use query string or body to query 。
body or query string will map to Dictionary<string, string> to handle 。
such filter operater just make api more restful (Where=urlencode(complex condition) will be more better) 。
{{nl}}
is null
?name={{nl}}
{"name":"{{nl}}"}
{{eq}}
Equal =
?name=xxx
{"name":"xxx"}
{{lt}}
LessThan or Equal <=
?age={{lt}}30
{"age":"{{lt}}30"}
{{le}}
LessThan <
?age={{le}}30
{"age":"{{le}}30"}
{{gt}}
GreaterThan or Equal >=
?age={{gt}}30
{"age":"{{gt}}30"}
{{gr}}
GreaterThan >
?age={{gr}}30
{"age":"{{gr}}30"}
{{nq}}
Not Equal !=
?age={{nq}}30
{"age":"{{nq}}30"}
{{lk}}
Prefix Like 'e%'
?name={{lk}}e
{"name":"{{lk}}e"}
{{rk}}
Suffix Like '%e'
?name={{rk}}e
{"name":"{{rk}}e"}
{{kk}}
Like '%e%'
?name={{kk}}e
{"name":"{{kk}}e"}
{{in}}
in array (bool/number/string)
?name={{in}}[true,false]
{"name":"{{in}}[\"s\",\"sky\"]"}
{{no}}
not
?age={{no}}{{lt}}30
{"age":"{{no}}{{lt}}30"}
Fields
return some Fields , no Fields or Fields=*
is return all
?Fields=name,age
{"Fields":"name,age"}
TotalCount
return total count
?TotalCount=true
{"TotalCount":"true"}
NoRows
no return rows
?NoRows=true
{"NoRows":"true"}
Offset
Offset Rows index
?Offset=10
{"Offset":10}
Rows
Take Rows count, default is 10
?Rows=100
{"Rows":100}
OrderBy
sort result
?OrderBy=name:asc,age:desc
{"OrderBy":"name:asc,age:desc"}
Where
complex condition filter
?Where=urlencode( not(name like 'H%') or name like '%v%' )
{"Where":"not(name like 'H%') or name like '%v%'"}
true
or false
12323
or 1.324
or -44.4
'sdsdfa'
or 'sds\'dfa'
or "dsdsdsd"
or "fs\"dsf"
= null
is null
name = null
=
Equal
name = 'sky'
<=
LessThan or Equal
age <= 30
<
LessThan
age < 30
>=
GreaterThan or Equal
age >= 30
>
GreaterThan
age > 30
!=
Not Equal
age != 30
like 'e%'
Prefix Like
name like 'xx%'
like '%e'
Suffix Like
name like '%xx'
like '%e%'
Like
name like '%xx%'
in ()
in array (bool/number/string)
in (1,2,3)
or in ('sdsdfa','sdfa')
or in (true,false)
not
not( age <= 30 )
and
age <= 30 and age > 60
or
age <= 30 or age > 60
()
(age <= 30 or age > 60) and name = 'killer'
最后此篇关于尝试让查询更简单的文章就讲到这里了,如果你想了解更多关于尝试让查询更简单的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!