ChinaDHF
学而不思则罔,思而不学则殆。
posts - 41,  comments - 224,  trackbacks - 5

    在轻量级数据持久层Seaking.PL简介及建议征集中,已经对Seaking.PL(以下简称PL)进行了简单的介绍,并对PL中的主要对象Session的使用进行了说明。本文将介绍PL中的另一个重要对象Query。(本文的部分用语及示例从轻量级数据持久层Seaking.PL简介及建议征集中承接而来)
    Query是数据查询对象,不具备Session对象的操作功能,但查询功能更加强大,包括对View(视图)的查询及对Join(关联)、Condition(条件)、Order(排序)、Alias(别名)等的支持。

使用说明:
1.声明及实例化。
同Session一样,Query对象不能用new进行实例化,而必须由DataProvider(数据提供者)对象产生。

Query query=dp.NewQuery(Employee.tableName);

参数可以是任何数据表名或视图名。示例中的Employee.tableName是Employee实体类所对应数据表的表名,等同于字符串“employee”。如果需要使用表的别名,可以如下声明:

Query query=dp.NewQuery(Employee.tableName,"em");

也可以在声明Query的实例后再指定Query的TableName属性值和TableAlias属性值:

Query query=dp.NewQuery();
query.TableName
=Employee.tableName;
query.TableAlias
="em";

不指定表的别名时,表的别名即是表名(下同)。
2.添加查询结果中的字段列表(Fields)。
 
query.Fields.Add(Employee.fieldName_Id);
query.Fields.Add(Employee.fieldName_Name);

参数是数据表或视图的字段名。如果需要指定字段的别名,可以如下声明:
 
query.Fields.Add(Employee.fieldName_Id,"emId");
query.Fields.Add(Employee.fieldName_Name,
"emName");

当使用联接查询时,表(或视图)、字段的别名是非常有用的。
如果不添加任何字段列表,Query将按照默认自动添加所有字段。
3.添加查询条件(Conditions)。
Query对象有一个非常重要的属性Conditions,用来指定查询条件。Conditions的使用相对复杂,将在下一篇中单独说明。
4.添加排列字段及排序方式(Orders)。
 
query.Orders.Add(Employee.fieldName_Id);

参数为排序字段的名称。Query默认的排序方式为升序(ASC),如果使用降序方式,必须显式指定:
 
query.Orders.Add(Employee.fieldName_Id,OrderKind.DESC);

可以添加多个排序字段,按照添加顺序分别为第一、第二……排序字段。
5.联接查询。
 
query.Joins.Add("sale");

参数为要联接的数据表名或视图名。如果需要指定别名,可如下声明:
 
query.Joins.Add("sale","mySale");

为便于区分,我们将Query的TableName所指的表(或视图)称为主表,将此处联接所指的表(或视图)称为联接表。
Query默认的联接方式是INNER JOIN,其他联接方式必须显示指定,如:
 
query.Joins["mySale"].JoinKind=JoinKind.LeftOuterJoin;

每个联接必须至少指定一个联接条件(OnCondition),否则将引发异常。
 
query.Joins["mySale"].AddOnCondition("id","employeeId");

第一个参数为主表的字段名,第二个参数为联接表的字段名。Query默认的联接方式为等值联接,其他联接方式必须显式指定,如:
 
query.Joins["mySale"].AddOnCondition("id","employeeId",CompareKind.Greater);

可以象对主表一样对联接表进行添加字段列表,添加查询条件等操作,如:
 
query.Joins["mySale"].Fields.Add("saleDate");
query.Joins[
"mySale"].Fields.Add("saleSum");

也可以根据联接表的字段对查询结果进行排序,与字段列表、查询条件不同的是,联接表的排序字段应该在Query中指定,如:
 
query.Orders.Add("mySale","saleDate",OrderKind.DESC);

可以看出,添加排序字段的操作同主表是一致的,但需要指定表名。事实上,添加主表的排序字段也可以使用这种格式,但主表的表名是可以省略的。
每一个Query可以添加一个或多个联接。
6.获取或填充数据集。
根据我们的需要做完以上的一项或多项工作后,便可以获取或填充数据集,得到我们需要的结果。

DataSet dataSet=query.GetDataSet();

DataSet dataSet=new DataSet();
query.FillDataSet(dataSet);

数据集中的表(DataTable)名为Query中所指定的TableAlias。

其他:
1.虽然Query对象的功能已相对强大,但仍无法满足一些复杂查询的要求,建议将复杂查询建立视图后使用。
2.为了便于使用者调试,Query对象提供了GetSelectString()方法,可以查看Query所生成的查询字符串。

结束
    轻量级数据持久层Seaking.PL简介及建议征集发布后,许多朋友给予了关注并发表了自己的看法,在此表示感谢。同时欢迎大家继续关注Seaking.PL并提出宝贵建议!

posted on 2006-07-07 10:04 东海风 阅读(1598) 评论(9)  编辑 收藏 网摘

FeedBack:
2006-07-07 11:14 | henry      
1.虽然Query对象的功能已相对强大,但仍无法满足一些复杂查询的要求,建议将复杂查询建立视图后使用。

花点心思下去应该不是问题的.
以下是我组件的Query对象:
http://henryfan.cnblogs.com/archive/2006/02/19/333591.html
  回复  引用  查看    
2006-07-07 12:12 | 丘比特 [未注册用户]
好東西
  回复  引用    
2006-07-07 15:01 | 达达      
楼住我是不是中午有评论??我记性不好不知道是不是这边
  回复  引用  查看    
#4楼 [楼主]
2006-07-07 15:08 | 东海风      
@达达
呵呵,是的。但是在本文的前一篇《轻量级数据持久层Seaking.PL简介及建议征集》中,谢谢您的关注。还有,我也得学习一下你所说的CodeDom,尽量提高性能。

  回复  引用  查看    
#5楼 [楼主]
2006-07-07 15:24 | 东海风      
@henry
谢谢。刚才拜读了你的文章,的确你所写的Query对象对查询的支持上要多一些。多下点功夫确实可以增强一些的,但我是这样想的:SQL是一种非常强大的、灵活的、高效的查询语言,正是由于这些,用一个查询类动态生成SQL去实现SQL的所有功能是非常困难的,比如聚合查询、联合查询(UNION)、子查询等,加之各种子句(如HAVING等)和语法(如CASE等),即使查询类真的能将这些功能全部实现,必然需要定义许多复杂的语法(方法或属性),对于复杂的查询,从使用者的角度看,未必比直接写SQL更容易。所以,本着实用的原则,我以为定义这些基本的查询也就差不多了,复杂查询还是用视图实现好一些。
  回复  引用  查看    
2006-07-08 09:29 | 无天刀绝 [未注册用户]
一直听说,视图查询效率很低,不知道是不是真的呢?另外个人觉得orm的最大好处仅限于简化了增删改操作,而且查询操作似乎复杂化了。为了orm而orm吗?orm到底为了什么呢?个人觉得单挑记录的增删改+类似powerbuilder的select查询语句生成器的效率应该更高些吧?如果纯orm不能够将开发效率尽最大的提高,那就失去了实际使用的意义,同理也不是为了面向对象而面向对象,能够提高开发效率(系统扩展性和可维护性当然也很重要)的面向对象设计(个人认为设计过程中应该是充分考虑到了对象的复用)才称得上是真正面向对象,否则,一切都素那浮云。。。
  回复  引用    
#7楼 [楼主]
2006-07-08 09:45 | 东海风      
@无天刀绝
关于视图的查询效率,我没有测试过,但应该不会比在程序中写SQL的效率更低吧。
至于orm(我所写的PL其实是算不上orm的),我觉得不仅能简化增删改操作,而且能大大方便查询操作。比如,有一个查询可能有n个查询条件,且每个查询条件都是可选的,即用户可能输入条件,也可能不输入条件,这时候手工组织SQL查询语句将是一件复杂而枯燥的工作。而如果使用orm,需要做的只是将用户输入的条件逐条追加即可,的确可以大大提高效率的(我不太熟悉其他的orm组件,至少我所写的PL是这样的)。
  回复  引用  查看    
2006-07-09 10:31 | 无天刀绝 [未注册用户]
@东海风
select语句的查询速度可以通过索引进行优化,视图不知道能不能这样,期待高手解答。
ps.我对轻量级的orm一直很关注,我知道的觉得做的比较不错的应该是听堂兄的SPL3.X,你可以参考一下,希望你能做的更好:)
  回复  引用    
2006-07-10 09:58 | henry      
查询视图会使用索引的,这个可能和数据库有关.
最起码在MS SQL和Oracle数据库里是这样,其实数据库会对Sql语句进行优化后再去查询.就如Like也有可能用到索引的,主要看如何使用.
  回复  引用  查看    




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-07-07 10:11 编辑过
Google站内搜索
找找看

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 
计数器:

阿里妈妈再掀疯狂采购风,网站广告位严重告急,急召天下站长


<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

与我联系

搜索

 

常用链接

留言簿(5)

随笔档案(39)

收藏夹(12)

技术网站

阅读排行榜