使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件
2011-02-24 11:42
836 查看
PDF.NET数据开发框架(Pwmis Data develop Framework,http://www.pwmis.com/sqlmap) 是一套借鉴iBatis、Hibernate、Linq等数据访问框架而来的轻量级数据开发框架,主要特点是具有iBatis特点的SQL-MAP功能和框架独特的实体对象查询语言--OQL,下面我们使用OQL来构造一个复杂的实体查询。
首先定义两个实体类:用户类和订单类,可以使用框架提供的实体类生成器生成,下面是详细代码:
/*
本类由PWMIS 实体类生成工具(Ver 4.1)自动生成 http://www.pwmis.com/sqlmap 使用前请先在项目工程中引用 PWMIS.Core.dll
2010/12/8 15:01:22
*/
using System;
using PWMIS.Common;
using PWMIS.DataMap.Entity;
namespace LocalDB
{
/// <summary>
/// 用户表
/// </summary>
[Serializable()]
public partial class Table_User : EntityBase
{
public Table_User()
{
TableName = "Table_User";
EntityMap=EntityMapType.SqlMap;
//IdentityName = "标识字段名";
IdentityName="UID";
//PrimaryKeys.Add("主键字段名");
PrimaryKeys.Add("UID");
PropertyNames = new string[] { "UID","Name","Sex","Height","Birthday" };
PropertyValues = new object[PropertyNames.Length];
}
/// <summary>
/// 用户标识
/// </summary>
public System.Int32 UID
{
get{return getProperty<System.Int32>("UID");}
set{setProperty("UID",value );}
}
/// <summary>
/// 姓名
/// </summary>
public System.String Name
{
get{return getProperty<System.String>("Name");}
set{setProperty("Name",value ,50);}
}
/// <summary>
/// 性别
/// </summary>
public System.Boolean Sex
{
get{return getProperty<System.Boolean>("Sex");}
set{setProperty("Sex",value );}
}
/// <summary>
/// 身高
/// </summary>
public System.Double Height
{
get{return getProperty<System.Double>("Height");}
set{setProperty("Height",value );}
}
/// <summary>
/// 出生日期
/// </summary>
public System.DateTime Birthday
{
get{return getProperty<System.DateTime>("Birthday");}
set{setProperty("Birthday",value );}
}
}
/// <summary>
/// 订单表
/// </summary>
[Serializable()]
public partial class Table_Order : EntityBase
{
public Table_Order()
{
TableName = "Table_Order";
EntityMap = EntityMapType.SqlMap;
//IdentityName = "标识字段名";
IdentityName = "OID";
//PrimaryKeys.Add("主键字段名");
PrimaryKeys.Add("OID");
PropertyNames = new string[] { "OID", "UID", "ProductName", "BuyCount", "OrderDate" };
PropertyValues = new object[PropertyNames.Length];
}
/// <summary>
/// 订单编号
/// </summary>
public System.Int32 OID
{
get { return getProperty<System.Int32>("OID"); }
set { setProperty("OID", value); }
}
/// <summary>
/// 用户号
/// </summary>
public System.Int32 UID
{
get { return getProperty<System.Int32>("UID"); }
set { setProperty("UID", value); }
}
/// <summary>
/// 产品名字
/// </summary>
public System.String Name
{
get { return getProperty<System.String>("ProductName"); }
set { setProperty("ProductName", value, 50); }
}
/// <summary>
/// 购买数量
/// </summary>
public System.Int32 Count
{
get { return getProperty<System.Int32>("BuyCount"); }
set { setProperty("BuyCount", value); }
}
/// <summary>
/// 购买日期
/// </summary>
public System.DateTime OrderDate
{
get { return getProperty<System.DateTime>("OrderDate"); }
set { setProperty("OrderDate", value); }
}
}
}
然后,我们来构造两个复杂的查询条件,直接上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PWMIS.DataMap.Entity;
namespace TestSqlMapEntity
{
class Program
{
static void Main(string[] args)
{
LocalDB.Table_User user = new LocalDB.Table_User();
List<OQLCompare> OrCmp1 = new List<OQLCompare>();
OQLCompare cmp = new OQLCompare(user);
OrCmp1.Add(cmp.Comparer(user.UID, "=", 1));
OrCmp1.Add(cmp.Comparer(user.UID, "=", 2));
OrCmp1.Add(cmp.Comparer(user.UID, "=", 3));
List<OQLCompare> OrCmp2 = new List<OQLCompare>();
OrCmp2.Add(cmp.Comparer(user.Name, "=", "aaa"));
OrCmp2.Add(cmp.Comparer(user.Name, "=", "bbb"));
OQLCompare result = new OQLCompare(
cmp.Comparer(OrCmp1, OQLCompare.CompareLogic.OR),
OQLCompare.CompareLogic.AND,
cmp.Comparer(OrCmp2, OQLCompare.CompareLogic.OR));
OQL oql = OQL.From(user).Select().Where(result).END;
Console.WriteLine("OQL To SQL is:\r\n" + oql.ToString());
/*
*
* OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Na
me = @CP5 ) )
*/
oql.ReSet();
LocalDB.Table_Order order = new LocalDB.Table_Order();
OQL q_order = OQL.From(order).Select(order.UID ).Where(
new OQLCompare(order).Comparer(order.OrderDate, ">=", DateTime.Now.AddDays(-10))
).END ;
oql.Select().Where(oql.Condition.AND(user.Sex ,"=",true).IN(user.UID, q_order));
Console.WriteLine("OQL To SQL is:\r\n" + oql.ToString());
/*
*
OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where Sex = @Sex0 AND UID IN (
SELECT UID
FROM Table_Order
Where OrderDate >= @CP1
)
*/
Console.Read();
}
}
}
程序中有两段代码,第一段代码是为了构造一个复杂的Where条件:
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Name = @CP5 ) )
意思是查询符合条件的多个UID并且查询符合条件的多个用户姓名,输出的完整SQL语句如下:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Name = @CP5 ) )
第二段代码是为了以UID为外键,从订单表中查询哪些用户在10日内提交了订单的用户信息,程序声明了两个OQL对象:
OQL oql;//用户相关的OQL对象;
OQL q_order //订单相关的OQL对象;
关键点在于q_order 对象作为oql对象的 IN 查询的参数,实现了SQL的IN子查询:
oql.Select().Where(oql.Condition.AND(user.Sex ,"=",true).IN(user.UID, q_order));
该条查询输出的完整SQL语句如下:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where Sex = @Sex0 AND UID IN (
SELECT UID
FROM Table_Order
Where OrderDate >= @CP1
)
OK,到此为止,我们可以使用我们的OQL查询出真正的实体集合了:
List<LocalDB.Table_User> result=EntityQuery<LocalDB.Table_User>.Query(oql);
一行代码搞定,是不是很简单?
PDF.NET的宗旨就是为了最大化精简你的数据开发,有兴趣请看我的博客其它文章或者到官网:http://www.pwmis.com/sqlmap
首先定义两个实体类:用户类和订单类,可以使用框架提供的实体类生成器生成,下面是详细代码:
/*
本类由PWMIS 实体类生成工具(Ver 4.1)自动生成 http://www.pwmis.com/sqlmap 使用前请先在项目工程中引用 PWMIS.Core.dll
2010/12/8 15:01:22
*/
using System;
using PWMIS.Common;
using PWMIS.DataMap.Entity;
namespace LocalDB
{
/// <summary>
/// 用户表
/// </summary>
[Serializable()]
public partial class Table_User : EntityBase
{
public Table_User()
{
TableName = "Table_User";
EntityMap=EntityMapType.SqlMap;
//IdentityName = "标识字段名";
IdentityName="UID";
//PrimaryKeys.Add("主键字段名");
PrimaryKeys.Add("UID");
PropertyNames = new string[] { "UID","Name","Sex","Height","Birthday" };
PropertyValues = new object[PropertyNames.Length];
}
/// <summary>
/// 用户标识
/// </summary>
public System.Int32 UID
{
get{return getProperty<System.Int32>("UID");}
set{setProperty("UID",value );}
}
/// <summary>
/// 姓名
/// </summary>
public System.String Name
{
get{return getProperty<System.String>("Name");}
set{setProperty("Name",value ,50);}
}
/// <summary>
/// 性别
/// </summary>
public System.Boolean Sex
{
get{return getProperty<System.Boolean>("Sex");}
set{setProperty("Sex",value );}
}
/// <summary>
/// 身高
/// </summary>
public System.Double Height
{
get{return getProperty<System.Double>("Height");}
set{setProperty("Height",value );}
}
/// <summary>
/// 出生日期
/// </summary>
public System.DateTime Birthday
{
get{return getProperty<System.DateTime>("Birthday");}
set{setProperty("Birthday",value );}
}
}
/// <summary>
/// 订单表
/// </summary>
[Serializable()]
public partial class Table_Order : EntityBase
{
public Table_Order()
{
TableName = "Table_Order";
EntityMap = EntityMapType.SqlMap;
//IdentityName = "标识字段名";
IdentityName = "OID";
//PrimaryKeys.Add("主键字段名");
PrimaryKeys.Add("OID");
PropertyNames = new string[] { "OID", "UID", "ProductName", "BuyCount", "OrderDate" };
PropertyValues = new object[PropertyNames.Length];
}
/// <summary>
/// 订单编号
/// </summary>
public System.Int32 OID
{
get { return getProperty<System.Int32>("OID"); }
set { setProperty("OID", value); }
}
/// <summary>
/// 用户号
/// </summary>
public System.Int32 UID
{
get { return getProperty<System.Int32>("UID"); }
set { setProperty("UID", value); }
}
/// <summary>
/// 产品名字
/// </summary>
public System.String Name
{
get { return getProperty<System.String>("ProductName"); }
set { setProperty("ProductName", value, 50); }
}
/// <summary>
/// 购买数量
/// </summary>
public System.Int32 Count
{
get { return getProperty<System.Int32>("BuyCount"); }
set { setProperty("BuyCount", value); }
}
/// <summary>
/// 购买日期
/// </summary>
public System.DateTime OrderDate
{
get { return getProperty<System.DateTime>("OrderDate"); }
set { setProperty("OrderDate", value); }
}
}
}
然后,我们来构造两个复杂的查询条件,直接上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PWMIS.DataMap.Entity;
namespace TestSqlMapEntity
{
class Program
{
static void Main(string[] args)
{
LocalDB.Table_User user = new LocalDB.Table_User();
List<OQLCompare> OrCmp1 = new List<OQLCompare>();
OQLCompare cmp = new OQLCompare(user);
OrCmp1.Add(cmp.Comparer(user.UID, "=", 1));
OrCmp1.Add(cmp.Comparer(user.UID, "=", 2));
OrCmp1.Add(cmp.Comparer(user.UID, "=", 3));
List<OQLCompare> OrCmp2 = new List<OQLCompare>();
OrCmp2.Add(cmp.Comparer(user.Name, "=", "aaa"));
OrCmp2.Add(cmp.Comparer(user.Name, "=", "bbb"));
OQLCompare result = new OQLCompare(
cmp.Comparer(OrCmp1, OQLCompare.CompareLogic.OR),
OQLCompare.CompareLogic.AND,
cmp.Comparer(OrCmp2, OQLCompare.CompareLogic.OR));
OQL oql = OQL.From(user).Select().Where(result).END;
Console.WriteLine("OQL To SQL is:\r\n" + oql.ToString());
/*
*
* OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Na
me = @CP5 ) )
*/
oql.ReSet();
LocalDB.Table_Order order = new LocalDB.Table_Order();
OQL q_order = OQL.From(order).Select(order.UID ).Where(
new OQLCompare(order).Comparer(order.OrderDate, ">=", DateTime.Now.AddDays(-10))
).END ;
oql.Select().Where(oql.Condition.AND(user.Sex ,"=",true).IN(user.UID, q_order));
Console.WriteLine("OQL To SQL is:\r\n" + oql.ToString());
/*
*
OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where Sex = @Sex0 AND UID IN (
SELECT UID
FROM Table_Order
Where OrderDate >= @CP1
)
*/
Console.Read();
}
}
}
程序中有两段代码,第一段代码是为了构造一个复杂的Where条件:
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Name = @CP5 ) )
意思是查询符合条件的多个UID并且查询符合条件的多个用户姓名,输出的完整SQL语句如下:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 ) AND ( Name = @CP4 Or Name = @CP5 ) )
第二段代码是为了以UID为外键,从订单表中查询哪些用户在10日内提交了订单的用户信息,程序声明了两个OQL对象:
OQL oql;//用户相关的OQL对象;
OQL q_order //订单相关的OQL对象;
关键点在于q_order 对象作为oql对象的 IN 查询的参数,实现了SQL的IN子查询:
oql.Select().Where(oql.Condition.AND(user.Sex ,"=",true).IN(user.UID, q_order));
该条查询输出的完整SQL语句如下:
SELECT UID,Name,Sex,Height,Birthday
FROM Table_User
Where Sex = @Sex0 AND UID IN (
SELECT UID
FROM Table_Order
Where OrderDate >= @CP1
)
OK,到此为止,我们可以使用我们的OQL查询出真正的实体集合了:
List<LocalDB.Table_User> result=EntityQuery<LocalDB.Table_User>.Query(oql);
一行代码搞定,是不是很简单?
PDF.NET的宗旨就是为了最大化精简你的数据开发,有兴趣请看我的博客其它文章或者到官网:http://www.pwmis.com/sqlmap
相关文章推荐
- PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题)
- 使用OQL“语言”构造ORM实体类的复杂查询条件
- PDF.NET数据开发框架实体类操作实例
- PDF.NET数据开发框架操作MySQL实体类操作实例
- PDF.NET数据开发框架实体类操作实例
- 欢迎使用 PDF.NET 数据开发框架【转载】
- PDF.NET数据开发框架实体类操作实例
- 让DBA去写数据访问层(DAL)代码--PDF.NET数据开发框架之SQL-MAP使用图解
- PDF.NET数据开发框架 之SQL-MAP使用存储过程
- 在Bootstrap开发框架中使用bootstrapTable表格插件和jstree树形列表插件时候,对树列表条件和查询条件的处理
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-复杂业务的实现(商品入库)-附案例操作视频
- PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
- 项目中使用的自定义数据访问类(复杂查询,复杂操作)
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- 项目中使用的自定义数据访问类(复杂查询,复杂操作)
- 在OQL上使用UPDLOCK锁定查询结果,安全的更新实体数据
- 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑
- 如何:使用 ADO.NET 实体框架数据源创建数据服务(WCF 数据服务)
- ThinkPHP框架五对数据的操作和条件查询
- ADO.NET实体数据框架中存储过程的使用