nicye

导航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

与我联系

搜索

 

常用链接

留言簿(2)

我参加的小组

我参与的团队

我的标签

随笔档案

相册

Friends

最新评论

阅读排行榜

评论排行榜

2008年4月12日 #

NicPetShop 新增 InnerJoin LeftJoin RightJoin 查询功能

满足一定的复杂查询,比查询 News 表里对应 News_Class 表里的 Status 值为 1

SQL 语句查询将为是:

select * from news a
inner join news_class b on b.id = a.news_class_id and b.status = 1

对于以往的 NicPetShop 来查询这个比较麻烦,一般会选择放弃 NicPetShop 的功能,直接使用 DBUtility.SqlHelper.ExecuteDataSet(sql) 后再操作,也就是最原始的方法。用 NicPetShop 的 GetItems 功能可以查出来,但性能就非常低了,如下:

List<NewsInfo> newses = News.GetItems("(select status from news_class where id = a.news_class_id) = 1"nullnull);



List<NewsInfo> newses = News.GetItems("Exists(select status from news_class where id = a.news_class_id and status = 1)"nullnull);

性能都没有 join 查询性能好



今天有想法把 NicPetShop 改造成支持 LeftJoin/RightJoin/InnerJoin 多表查询,需要考虑到以下几点:

1、采用什么样的语句查询? select * from 吗?
2、采用 * 查询会不会增加没有必要的查询返回?性能危害有多大?值不值得?
3、采用字段式选取查询,但这样会增加代码输入量,对于开发者不太方便,我已经直接放弃了这点。
4、select * from 可以返回一个很多表的横向记录,记录返回如何保存到对象中?如 NewsInfo 里的所有成员与数据表 News 一一对应,我可以增加一个 List<object> Join 来保存 Join 查询的结果?完全可以实现,但问题还是回归到了第 2 点上面。
5、我是否该放弃主表以外(即 Join 表查询到的字段)的数据吗?然后页面上还要 news.news_classInfo.Title 这样使用吗?会不会太浪费了?对开发效率和性能损耗是否平衡?

现在使用 NicPetShop 的新功能来得到这样的 List 吧:

List<NewsInfo> news = News.GetItems(new InnerJoin[] { new InnerJoin(typeof(NewsInfo), "b""b.id = a.news_class_id AND b.status = 1") }, nullnullnull);

最后执行的 SQL 语句将是:

SELECT a.[id], a.[title], a.[content], a.[create_time]
FROM [dbo].[news] a
INNER JOIN [dbo].[news_class] b ON b.id = a.[news_class_id] AND b.status = 1


欢迎大家一起讨论!

posted @ 2008-04-12 23:17 nicye 阅读(111) | 评论 (0)编辑