(原创)通用查询实现方案(可用于DDD)[附源码] -- 简介
[Fact]
public void TestQuery3()
{
var helper = new TypeInfoHelper<Order>();
//获得订单集合中的第一张订单,用于之后的单元测试验证
var findOrder = orders.First();
//定义一个查询,条件为订单主键等于前面获取的订单对象的主键值
var query = new Query(typeof(Order))
{
RootExpression = helper.GetProperty(p => p.BillId).EqualTo(findOrder.BillId)
};
/*第一种编译方式*/
//定义一个生成Lambda表达式的编译器对象
var compiler = new LambdaExpressionCompiler<Order>(query);
//将查询对象编译为Linq表达式
var expression = compiler.Compile();
//对订单集合执行linq查询
var items = orders.Where(expression.Compile()).ToList();
//验证查询结果中仅包含一张订单,且订单编号与参照订单的编号相同
Assert.Equal(items.Count, );
Assert.Equal(items.First().BillNo, findOrder.BillNo); /*第二种编译方式*/
//定义一个生成SQL脚本的编译器对象
var sqlCompiler = new SqlWhereClauseCompiler(query) { GenSelectPart = true };
//将查询对象编译为SQL脚本
var sql = sqlCompiler.Compile();
Console.WriteLine(sql);
//执行sql脚本
var reader = dbHelper.Read(sql, sqlCompiler.ParameterValues);
//验证返回的结果中只有一条记录,且订单编号与参照订单的编号相同
Assert.Equal(reader.Read(), true);
Assert.Equal(findOrder.BillNo, reader["BillNo"]);
Assert.Equal(reader.Read(), false);//验证只能执行读取一次操作
}
SELECT * FROM xzcOrder AS o
WHERE (o.BillNo LIKE 'PO%' OR NOT o.BillDate >= '2014-1-1 0:00:00' )
AND EXISTS(SELECT 1 FROM supplier WHERE supplier.Id=o.SupplierId AND supplier.Code LIKE '%X%')
AND o.Invalid = 0
AND EXISTS(SELECT 1 FROM Items AS d WHERE d.BillId=o.BillId AND EXISTS(SELECT 1 FROM Product AS p WHERE p.Id=d.ProductId AND p.Unit = '部'))
AND EXISTS(SELECT 1 FROM Items AS d WHERE d.BillId=o.BillId AND d.Qty < o.TotalQty)
相应的C#代码
var helper = new TypeInfoHelper<Order>();
var query = new Query(typeof(Order))
{
RootExpression = helper.GetProperty(p => p.BillNo).StartsWith("PO") //单号以PO打头
.Or(helper.GetProperty(p => p.BillDate).GreaterThanOrEqualTo(new DateTime(, , )).Not())//订单日期 不 大于等于 2014-1-1
.Unitary() //上面两个条件设为独立整体,即用()号包围
.And(helper.GetProperty(p => p.Supplier.Code).Contains("X"))//供应商编码中包含字符"X"
.And(helper.GetProperty(p => p.Invalid).EqualTo(false)) //订单失效标志为否
.And(helper.GetProperty(p => p.Items.FirstOrDefault().Product.Unit).EqualTo("部")) //订购产品的计量单位为"部"
.And(
//订单明细中各项订购数量小于订单总订购数量,仅为测试,无实际意义
helper.GetProperty(p => p.Items.FirstOrDefault().Qty)
.LessThan(helper.GetProperty(p => p.TotalQty)))
};
List<Order> items;
var sqlCompiler = new SqlWhereClauseCompiler(query) { GenSelectPart = true };
var sql = sqlCompiler.Compile();
Console.WriteLine(sql);
(原创)通用查询实现方案(可用于DDD)[附源码] -- 简介的更多相关文章
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- 通用查询实现方案(可用于DDD)[附源码] -- 简介
原文:通用查询实现方案(可用于DDD)[附源码] -- 简介 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html). [ ...
- 通用查询实现方案(可用于DDD)[附源码] -- 设计思路
原文:通用查询实现方案(可用于DDD)[附源码] -- 设计思路 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). ...
- 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...
- C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)
前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 日志组件Log2Net的介绍和使用(附源码开源地址)
Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
随机推荐
- 2o_TwoTips
∮Linux 使用的两个小技巧 开启启动脚本 和 环境变量问题 §1.开机启动脚本 && 周期任务 环境 CentOS7:3.10.0-327.el7.x86_64 # head /e ...
- JAVA EE中session的理解
转自[互动百科]http://www.baike.com/wiki/Session Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...
- nslookup命令
nslookup命令可以从本地DNS服务器中查看所有的IP地址和域名信息(它就像一本互联网电话簿).例如,想要找到www.baidu.com的IP地址就可以使用nslookup命令. nslookup ...
- redis集群讨论
一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性 ...
- Tomcat安装后,远程IP无法访问的问题。
我在使用阿里云与聚石塔的时候,发现Tomcat启动后,本地可以访问,但是外网无法访问,即使关闭防火墙也无法访问. 原因是 云平台的网络拦截. 阿里云:有一个入网规则 和 出网规则 ,流入数据端口 流 ...
- 解决Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization.
一.问题描述 OS:centos 原因是拷贝虚拟机造成的. 使用vmworkstation打开虚拟机的时候,要选择copy而非move. 二.解决描述 网络上解决步骤各异,其实就一句话.只要保证vmw ...
- eclipse debug maven项目时出现缺少库的问题
调试maven web项目时出现缺少库的情况导致项目无法启动 可是打包到tomcat发布却一切正常 后来在stackoverlow上找到了解决方案 项目右键属性->Deployment Ass ...
- [c#]一个窗体调用另一个窗体的事件
StuAddForm a = new StuAddForm(); a.IfStudent(textBox1.Text.Trim()):
- 关于c#调用c编译器
这个已经过了好久了具体的实现代码没得,但是大致思路自己整理了一下: 首先要调用c编译器,process.start(): 之后需要自己来进行编译器对代码执行的命令.
- HDU 4831 Scenic Popularity
Scenic Popularity Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...