Snake.Net 框架中的ORM(四) (Version 0.2 Beta)

 

6.查询<?xml:namespace prefix = o />

       ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构,甚至可以屏蔽数据库之间的差异,以利于程序在不同数据库环境下的移植。

如一般的关系型数据库所具有的查询功能一样,Snake.Net框架也有着丰富的查询功能。当前版本的Snake.Net支持三种查询方式:查询构造器, OSQL查询语言和预定义的SQL语句。

       1)查询构造器


Snake.Net框架使用的是对象化的查询技术:将查询条件对象化,然后根据不同类型的数据库编写SQL语言解析器,将查询对象转化成对应的SQL语句,进行数据查询。
在Snake.Net框架内,可以使用查询构造器DataObjectQueryBuilder,通过添加特定的过滤条件、排序字段以及分页条件,构造查询对象,以实现简单功能的查询,请看演示代码:

None.gif // declare
None.gif
IList employees;
None.gifDataObjectQueryBuilder builder;
None.gif
None.gifbuilder 
=   new  DataObjectQueryBuilder( typeof (Employee));            
None.gif
ExpandedBlockStart.gifContractedBlock.gif
using (IObjectManager om  =  ObjectManager.Create( typeof (Employee))) dot.gif {
InBlock.gifbuilder.AppendCondition(
"FirstName""Nancy");
InBlock.gifemployees 
= om.Query(builder);
ExpandedBlockEnd.gif}

None.gif


 

2OSQL语言

OSQL语言是Snake.Net主要的查询方式。OSQL语言是一种类似于标准SQL语言的对象化、结构化的查询语言。Snake.Net可以通过不同的数据库解析器将OSQL语言转化为各自的SQL语言,因而使用OSQL语言查询也具有跨数据库系统查询的能力。

下面简单介绍一下OSQL语言,OSQL语言是一种面向对象的查询语言,由前缀和表达式组成(OSQL的前缀参见表 <?xml:namespace prefix = st1 />6-2-1)。表达式又有由逻辑运算符(见表 6-2-2)、对象属性、操作运算符(见表 6-2-3)和值四个部分组成,同时支持括号语法及其嵌套使用。

 

前缀

描述

Where:=, Condition:=, C:=

过滤条件

Order:=, Sort:=, S:=

排序条件

Page:=, P:=

分页条件

6-2-1 OSQL中的前缀

 

逻辑运算符

描述

And, &&

过滤条件

Or, ||

排序条件

Xor, ^

分页条件

6-2-2 OSQL中的逻辑运算符

 

 

操作运算符

描述

!

is empty

是空值

is null

Null

=

等于

>=

大于等于

>

 

大于

<

 

小于

<=

小于等于

<>

 

不等于

begin

字符起始于

end

字符结束于

contains

包含特定字符

in

包含特定值

between

在两个值之间

6-2-3 OSQL中的操作运算符



下面我们看一句OSQL语句的范例及其使用的代码演示:

None.gif C: =  ShipName  =   ' Ernst Handel '   &&  (Product.ProductName  begin   ' e '  || Product.ProductName  begin   ' c '
None.gifS:
=   Order .OrderDate  Desc
None.gifP:
= 3 - 1
None.gif

OSQL语言只需编写过滤条件、排序字段以及分页条件,至于对象与对象之间的关联关系,则全部由系统自动处理,对使用者来说是完全屏蔽的。接下来我们再看使用ObjectManager运行OSQL语句并获取查询结果的示例:

None.gif // declare
None.gif
IList orders;
None.gif
string  expression;
None.gif
None.gifexpression 
=   " ShipName = 'Ernst Handel' &&  "   +
None.gif
"  (Product.ProductName begin 'e' || Product.ProductName begin 'c') "   +
None.gif    
"  S:= Order.OrderDate Desc "   +
None.gif    
"  P:=3-1 " ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
using (IObjectManager om  =  ObjectManager.Create( typeof (Order))) dot.gif {
InBlock.gif
InBlock.gif    orders 
= om.Query(expression);
ExpandedBlockEnd.gif}

None.gif

(3)预定义的SQL语句
所谓预定义的SQL,就是事先编写好查询使用的SQL语句,并选择设置一个或多个参数(参数的格式根据各个数据库驱动的特点格式略有不同,如Access数据库使用“?”表示,如果是MSSQL则用“@parametername”表示等等)。
Snake.Net支持在配置文件预先定义SQL语句,运行时传递名称和参数进行调用,返回查询结果。这些SQL语句可以是简单的单表查询,也可以是使用视图和存储过程的复杂查询。
Snake.Net的预定义SQL语句存放于配置文件中,请看演示代码:


None.gif < queryMappings >
None.gif
< queryMapping  name ="OrdersQry" >
None.gif    SELECT OrderID, CustomerID, EmployeeID, ShipName
None.gif        FROM [Orders Qry]
None.gif        Where Country = ?
None.gif    
</ queryMapping >
None.gif    
< queryMapping  name ="OrdersQry2" >
None.gif    SELECT OrderID, CustomerID, EmployeeID, ShipName
None.gif        FROM [Orders Qry]
None.gif        Where Country = ?
None.gif        And ShipRegion = ?
None.gif    
</ queryMapping >
None.gif    
< queryMapping  name ="OrdersQry3" >
None.gif    @@Orders
None.gif    
</ queryMapping >
None.gif
</ queryMappings >
None.gif

然后我们看一下在程序中如何调用预定义的SQL语句:

None.gif // declare
None.gif
IList orders;
None.gifIObjectQueryManager qmm;
None.gif
None.gifqmm 
=  ObjectManager.Create( typeof (Order))  as  IObjectQueryManager;
None.gif
None.giforders 
=  qmm.QueryByName( " OrdersQry " " France " );
ExpandedBlockStart.gifContractedBlock.gif
if  (orders.Count  >   0 ) dot.gif {
InBlock.gif    Console.WriteLine(
"Count:{0}", orders.Count);
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(int i = 0; i <orders.Count; i++)dot.gif{
InBlock.gif        Order order 
= orders[i] as Order;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gifqmm 
=  ObjectManager.Create( typeof (QueryObject))  as  IObjectQueryManager;
ExpandedBlockStart.gifContractedBlock.giforders 
=  qmm.QueryByName( " OrdersQry2 " new   string [] dot.gif {"Brazil""SP"} );
ExpandedBlockStart.gifContractedBlock.gif
if  (orders.Count  >   0 ) dot.gif {
InBlock.gif    Console.WriteLine(
"Count:{0}", orders.Count);
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(int i = 0; i <orders.Count; i++)dot.gif{
InBlock.gif        QueryObject item 
= orders[i] as QueryObject;
InBlock.gif        Console.WriteLine(item[
0]);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif


使用预定义的SQL语句,Snake.Net将根据参数直接运行定义的SQL语句,然后根据返回的数据,充填指定类型的对象。一方面由于是直接运行SQL语句不需要进行解析,所以它的运行效率是最高的,但另一方面预定义的SQL显然只能适用于特定的数据库,缺乏良好的移植性。

转载于:https://www.cnblogs.com/soulroom/archive/2005/11/15/276807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值