(原创)通用查询实现方案(可用于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平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
随机推荐
- java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejected from java.util.concurrent.ThreadPoolExecutor@11f7cc04[Terminated, pool size = 0, active threads
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejec ...
- Programming Entity Framework 翻译
刚开始接触.net,c#语法应该说还没掌握好.学习实践的旅程就从linq和EF开始吧.感觉相比之前的开发方式,linq和EF方便好多. linq入门用了好久,因为c#不行,补习了2.0的泛型,3.0和 ...
- C#绘制传感器代码
//以下代码添加到任一窗口下即可 private int 旋转角度 = 0; private int 边长 = 10; protected override ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- CVPR 2011 Global contrast based salient region detection
Two salient region detection methods are proposed in this paper: HC AND RC HC: Histogram based contr ...
- DAO实例代码优化
一般在接口的实现类中不用来实现登陆等功能,在测试类中实现并且测试. package com.beiwo.epet.service.impl; import com.beiwo.epet.dao.Mas ...
- vc++ 程序开机自启动和取消启动
//开机启动 int CMainWnd::CreateRun() { //添加以下代码 HKEY hKey; }; //得到程序自身的全路径 DWORD dwRet = GetModuleFileNa ...
- win7默认网关不可用怎么解决
方法一:自动获取 1 有的电脑设置了固定的网关和IP地址. 设置方法: 进入"控制面板" , 然后点击"网络和Internet"!! 步骤阅读 2 然后点击& ...
- jquery template模版引擎
jTemplates http://jtemplates.tpython.com/ jquery-template https://github.com/codepb/jquery-template ...
- PRML
PRML 学习之 第一章 介绍 Introduction #欢迎共同学习和讨论,由于本文将不断修改,谢绝转载 模式识别问题具有重要且久远的历史.比如,16世纪开普勒发现行星运动定律,又如20世纪出发现 ...