您的位置:首页 > 移动开发 > Objective-C

ObjectQuery:ActiveRecord 强类型对象查询工具

2006-10-16 14:49 441 查看
ObjectQuery是一个结合ActiveRecord的强类型对象查询工具,功能类似 Ayende的[u]NHibernate Query Generator [/u],但更强大。
下载:ObjectQuery.src.rar 44KB
ObjectQuery.bin.rar 611KB
使用示例:

Post[] findAll = Query.From(DB.Post).Where(DB.Post.Title.StartsWith("Overloading") || DB.Post.Title == "Operator").FindAll();
object[][] groupby = Query.From(DB.Post).GroupBy(DB.Post.Title).FindAll(DB.Post.Title, Aggregate.Count(DB.Post));
DateTime? aggregate = Query.From(DB.Post).FindOne(Aggregate.Max(DB.Post.Created));
Post findFirst = Query.From(DB.Post).OrderBy(DB.Post.Created.DescOrder()).FindFirst();
Post[] booltest = Query.From(DB.Post).Where(DB.Post.Published).FindAll();
Blog[] listtest = Query.From(DB.Blog).Where(DB.Blog.Posts.Count > 0).FindAll();
Post[] math = Query.From(DB.Post).Where(DB.Post.Id + 1 > 0).FindAll();

使用步骤:
一、通过数据库表定义或者直接写出ActiveRecord的类。
数据库表定义:

CREATE TABLE [dbo].[Blogs] (
[blog_id] [int] IDENTITY (1, 1) NOT NULL ,
[blog_name] [varchar] (50) NULL ,
[blog_author] [varchar] (50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Posts] (
[post_id] [int] IDENTITY (1, 1) NOT NULL ,
[post_title] [varchar] (50) NULL ,
[post_contents] [text] NULL ,
[post_category] [varchar] (50) NULL ,
[post_blogid] [int] NULL ,
[post_created] [datetime] NULL ,
[post_published] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

ActiveRecord类定义:

namespace ObjectQuery.Test
2

二、将ActiveRecord类加入一个项目(ObjectQuery.Test),编译项目生成dll或者exe文件(ObjectQuery.Test.exe)。
三、通过命令行运行代码生成工具ObjectQuery.Generator.exe,生成ObjectQuery.gen.cs / .vb 文件。
ObjectQuery.Generator.exe cs e:\temp\ObjectQuery.Test.exe e:\temp

//------------------------------------------------------------------------------
2// <auto-generated>
3// 此代码由工具生成。
4// 运行库版本:2.0.50727.42
5//
6// 对此文件的更改可能会导致不正确的行为,并且如果
7// 重新生成代码,这些更改将会丢失。
8// </auto-generated>
9//------------------------------------------------------------------------------
10
11namespace ObjectQuery.Test
12

四、将代码生成器生成的文件加入到项目中,就可以使用ObjectQuery的强大功能了。

Post.DeleteAll();
2 Blog.DeleteAll();
3
4 Blog blog = new Blog();
5 blog.Name = "tinifish @ blog";
6 blog.Author = "tinifish";
7 blog.Save();
8
9 Blog blog1 = new Blog();
10 blog1.Name = "tinifish @ blog";
11 blog1.Author = "tinifish";
12 blog1.Save();
13
14 Post post = new Post();
15 post.Blog = blog;
16 post.Title = "I love Active Record";
17 post.Contents = "Indeed I do!";
18 post.Category = "dotnet";
19 post.Created = DateTime.Now;
20 post.Published = false;
21 post.Save();
22
23 Post post1 = new Post();
24 //post1.Blog = blog;
25 post1.Title = "Overloading post";
26 post1.Contents = "Indeed I do!";
27 post1.Category = "DOTNET";
28 post1.Created = DateTime.Now;
29 post1.Published = true;
30 post1.Save();
31
32 using (new SessionScope())
33 {
34 Post[] findAll = Query.From(DB.Post).Where(DB.Post.Title.StartsWith("Overloading") || DB.Post.Title == "Operator").FindAll();
35 Assert.IsTrue(findAll.Length == 1 && findAll[0].Id == post1.Id);
36
37 Post[] findAll1 = Query.From(DB.Post).Where(DB.Post.Blog == blog
38 && DB.Post.Title.StartsWith("Overloading") || DB.Post.Title == "Operator").FindAll();
39 Assert.IsTrue(findAll1.Length == 0);
40
41 object[][] groupby = Query.From(DB.Post).GroupBy(DB.Post.Title).FindAll(DB.Post.Title, Aggregate.Count(DB.Post));
42 Assert.IsTrue(groupby.Length == 2);
43
44 DateTime? aggregate = Query.From(DB.Post).FindOne(Aggregate.Max(DB.Post.Created));
45 Post findFirst = Query.From(DB.Post).OrderBy(DB.Post.Created.DescOrder()).FindFirst();
46 Assert.AreEqual(aggregate, findFirst.Created);
47
48 Post[] booltest = Query.From(DB.Post).Where(DB.Post.Published).FindAll();
49 Assert.IsTrue(booltest.Length == 1 && booltest[0].Id == post1.Id);
50
51 Blog[] listtest = Query.From(DB.Blog).Where(DB.Blog.Posts.Count > 0).FindAll();
52 Assert.IsTrue(listtest.Length == 1 && listtest[0].Id == blog.Id);
53
54 Post[] math = Query.From(DB.Post).Where(DB.Post.Id + 1 > 0).FindAll();
55

项目所使用的NHibernate和Castle.ActiveRecord的版本为svn服务器上的最新版本。
这是我在博客园发的第一篇随笔,请大家多多支持。欢迎功能建议和意见反馈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: