惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
罗磊的独立博客
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
美团技术团队
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
The Register - Security
The Register - Security
IT之家
IT之家
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
NISL@THU
NISL@THU
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
B
Blog
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
S
Security Affairs
小众软件
小众软件
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
A
Arctic Wolf
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

博客园 - Ant

ASP.NET Core 项目简单实现身份验证及鉴权 使用iconfont图标 IIS调试ASP.NET Core项目 配置GitHub的SSH key Visual Studio连接Oracle数据库 Visual Studio Code 如何将新项目发布到GIT服务器 Xamarin踩坑经历 Abp项目中的领域模型实体类访问仓储的方法 在Abp中集成Swagger UI功能 发布以NLog作为日记工具的ASP.NET站点到IIS注意事项 Android Studio 简介及导入 jar 包和第三方开源库方[转] 解决jquery-ui-autocomplete选择列表被Bootstrap模态窗遮挡的问题 ORACLE存储过程创建失败,如何查看其原因 EF6配合MySQL或MSSQL(CodeFirst模式)配置指引 火狐通行证升级为Firefox Sync后,如何在多设备间同步书签等信息 (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介 利用Lambda获取属性名称 Entity Framework 6.0 源码解读笔记(一) [转]Sql server2005中如何格式化时间日期
(原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路
Ant · 2014-09-23 · via 博客园 - Ant

【声明】

【系列文章】

通用查询实现方案(可用于DDD)[附源码] -- 代码解读

在上一篇博文中,我向大家简单介绍了Xant.Querier通用查询,并分享了项目源码。这一篇继续给大家分享我的设计思路,也为了日后自己翻看。

【如何表示最基本的条件】

最基本的查询条件可以描述为{字段}={值},运算结果为布尔值。比较运算符不一定是等于,可以是包含、大于、小于等于,那么可以将一个条件描述为这样的表达式,该表达式计算结果为布尔值:

OK,我们已经完成了第一步,可以表达出像单号等于"PO123"或是名字包含"中国"这样的条件了。

但这只是一个良好的开始而已,实际业务中我们很可能用像 {数量}*{单价}>{值} 或是 {单价}*(1-{折扣}/100)>{值} 这样的条件,那么如何实现呢?

【因子、算式抽象过程】

是时候对我们的设计进行抽象了,我们将参与表达式计算或条件比较的元素都定义为因子,字段、常量都是具体的因子类型,两个因子的数学运算称为一个算式。

那么我们该怎么实现复杂算式的表达呢?

我们可以将算式定义为一种特定类型的因子,地位与字段、常量平级,这样算式中就可以包含子算式、字段或常量。如下图:

算式就可以被抽象为两个因子之间以算术运算符连接的关系:{因子}.算术运算({因子})。

算式以左子树优先二叉树表式为:

这样一来,我们就可以很方便的表示如前面提到的{单价}*(1-{折扣}/100)这样的算式了:

OK,有了算式的设计,我们可以表达因子间复杂的计算了,下面我们开始对条件进行设计。

有了前面的经验,我们的设计会顺利很多,我们将条件抽象为两个因子的关系运算,这是水到渠成的事。那么该怎样设计多个条件的组合呢?

如果大家对前面因子的抽象过程融会贯通了的话,要做出这个设计并不难,不妨停下来先想想你会怎么设计实现。

【组合条件的实现】

简单的条件以左子树优先的二叉树表示为:

两个条件的组合定义为一个新类"条件对",以左子树优先的二叉树表示为:

"条件对"将对左条件和右条件执行指定的逻辑运算(AND/OR/NOT),因为左(右)条件本身又可以为条件对,所以可以满足复杂的条件组合。

下面我们来定义一个简单的查询

查询对象:订单

查询条件:订单编号以”PO”打头 且 总订购金额/总订购数量(即平均单价)>=5500的订单

【对于关联实体(表)的查询】

我们经常会用到诸如找出某个供应商的订单或是订购了某类产品的订单,我们要获取的是订单对象,但条件针对的是订单对象的关联对象,我们该怎样满足这样的条件查询呢?

我能想到是首先对字段因子进行重构,字段因子应不仅能表达其字段名称还要能够表达完整路径(如订单.订购项.产品.编码),如此我们就便能这样表示"包含有编码以A开头的产品订购项的订单":

{订单.订购项.产品.编码}.StartsWith("A")

这样在编译器编译查询对象时,将字段的完整路径逐级展开进行解析,生成相应的SQL脚本或是Linq语句即可实现关联查询。

下面我们来定义两个稍微复杂的查询

查询对象:订单

查询条件:供应商编号以”S”打头 且 存在订购明细中单价*订单折扣(即折后单价)>=5000的订单

查询对象:订单

查询条件:({订单编号}以”PO”开头 或 {订单日期}不大于等于2014-1-1) 且 存在产品编码为”A1”的产品订购记录 且 订购明细中各项订购数量小于订单总订购数量

【写在最后】

博文除了图片以外绝大部分文字内容都是我在上下班乘坐地铁或公交时在手机上完成的,写作不昜,如果对你还有点用处或启发的话,望不吝点,谢谢!