(原创)通用查询实现方案(可用于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平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
随机推荐
- C# 加密解密文件
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...
- Linux 命令 创建文件
1.vi vi 1.txt 会直接创建并打开一个文件1.txt 2.touch touch的作用是更改一个文件或目录的时间.touch 2.txt 如果2.txt不存在,则创建空文件2.txt 3.e ...
- 未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖项。系统找不到指定的文件
未能加载文件或程序集“MySql.Web.v20, Version=6.9.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖 ...
- iOS NSUserDefaults 存放位置
NSUserDefaults以plist文件的形式存放在app目录下的Library文件夹中.
- 使用scala开发spark入门总结
使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...
- RabbitMQ消息队列1: Detailed Introduction 详细介绍
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- XproerIM V2开源,基于XproerUI引擎构架
资源下载:XproerIM源代码(访问密码:2e47),imServer(访问密码 364c), 技术交流群:6259765 技术支持:3040217208 咨询邮箱:2190615607@qq.co ...
- 1-12 ARP协议
ARP(Address Resolution Protocol)地址解析协议,负责将相应的IP地址解析成MAC地址. 在局域网中,网络中实际传输的是‘帧’,帧里面包含了目的主机的MAC.ARP就是用来 ...
- .net 下载文件几种方式
方式一:TransmitFile实现下载.将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件. protected void Button1_Click(object sender, ...
- 15.6.2 Configuring the Merge Threshold for index pages[innodb]
MERGE THRESHOLD 提供了可以合并相邻索引page的功能. 默认值是50 如果一个页中数据被删除或者更新减小,导致页中有空白部分,空白部分接近合并门槛的值,则会和相邻页合并, 但是两个pa ...