通用查询实现方案(可用于DDD)[附源码] -- 简介
原文:通用查询实现方案(可用于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/3985353.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 设计思路
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- 通用查询实现方案(可用于DDD)[附源码] -- 设计思路
原文:通用查询实现方案(可用于DDD)[附源码] -- 设计思路 [声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3988592.html). ...
- 开源方案搭建可离线的精美矢量切片地图服务-8.mapbox 之sprite大图图标文件生成(附源码)
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- 【转】.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平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
- Cesium专栏-填挖方分析(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...
随机推荐
- 在KVM中执行windows 10虚机(by quqi99)
作者:张华 发表于:2015-12-22版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) KVM ...
- 微软100题第51题:和为n连续正数序列
题目:输入一个正数n,输出全部和为n连续正数序列.比如输入15,因为1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 方法一:记录序列长度.推断首项是否满足条 ...
- GridView中使用CheckBox
asp.net中checkbox是向server提交时才干触发事件 把该控件的autopostback设置为true.才干响应事件 protected void Checkbox_CheckedCh ...
- POJ 1012 Joseph(打表题)
题意:约瑟夫环的变形.要求寻找到一个杀人循环节m使后半节的坏人先被所有杀光. 直接链表模拟出结果,再打表即可: 代码:(凝视的是打表码) #include<iostream> #inclu ...
- js html 事件冒泡
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- nyoj--42--一笔画问题(并查集)
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. ...
- 34.share_ptr智能指针共享内存,引用计数
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- EntityFramework学习笔记1--安装
1.新建项目 2.工具=>NuGet程序包管理器=>程序包管理控制器 3.PM> Install-Package EntityFramework 安装EF
- ScrollView嵌套GridView不显示顶部
/* * scrollView中嵌套GridView不能显示头部 * * 方案①:scrollView.smoothScrollTo(0, 0); * * ...
- PHP接收GET中文参数乱码的原因及解决方案
方案1: $str = iconv("gb2312","utf-8",$str); 方案2: mb_convert_encoding($str, "u ...