Code4Fun: LINQ2Douban Demo Code

LINQ2Douban是基于LINQToolKit的douban网的api的全功能调用框架。通过LINQ2Douban,你可以用LINQ-Style的方式对douban的数据进行CRUD操作。本文示例了如何使用LINQ2Douban来实现对Douban API的调用。

LINQToolKit是基于.Net的Web API调用框架。通过定义的XML Mapping,可以实现XML和单个实体对象和关系之间的映射,并可以在运行时对需要访问的属性进行延迟加载。LINQToolKit封装了LINQ style的查询和数据处理方式,基于LINQToolKit你可以用from/where/select来直接进行查询,这些关键字的语义可以通过定义的QueryRule来生成相应的查询uri(用于invoke web api),并且可在上面进行任何Enumerable和Querable允许的的数据操作。

LINQToolKit可以通过扩展支持任何规范的web api,自带了Google Data API的支持

LINQ2Douban是基于LINQToolKit的douban网的api的全功能调用框架。通过LINQ2Douban,你可以用LINQ-Style的方式对douban的数据进行CRUD操作。

声明:LINQ2Douban不是官方框架,K.K只是douban的忠实用户

相关信息

douban api讨论组:http://www.douban.com/group/dbapi/

google data protocol :http://code.google.com/apis/gdata/docs/2.0/reference.html

你可以通过google code获取LINQToolKit和LINQ2Douban的所有代码和Example

http://code.google.com/p/linqtodouban/

demo code源码下载:

http://linqtodouban.googlecode.com/files/LINQ2Douban%20Demo.rar (for vs2010 beta2 solution)

https://files.cnblogs.com/chwkai/DoubanDemo.rar (for vs2008 solution)

所有疑问和错误请和K.K邮件联系chwkai@gmail.com

关于LINQToolKit稍后会有文档介绍

准备工作

在运行Demo Code之前,请先修改context.config文件中的access token,如何获取access token请访问douban api组

1
2
3
4
5
6
7
8
<request type="LINQToolKit.Douban.DoubanRequest, LINQToolKit.Douban">
    <!--
    <apiKey></apiKey>
    <apiKeySecret></apiKeySecret>
    <accessToken></accessToken>
    <accessTokenSecret></accessTokenSecret>
    -->
  </request>

Demo Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
/// <summary>
    /// Demos for LINQToolKit.Douban
    /// </summary>
    /// <remarks>
    /// This framework is under the GNU licence and Creative Commons 3.0.
    /// You can also get a copy of the source code from google code
    /// For more information and further support, please contace with kevin (chwkai@gmail.com)
    /// </remarks>
    class Program
    {
        static void Main(string[] args)
        {
            var context = new DoubanContext();
            // 用于输出查询的url
            context.Log = Console.Out;
            context.Me.Title.Dump();
 
            // 回复广播(需要授权)
            // context.CommentMiniBlog("miniBlogId", "content");
            // 参与指定活动(需要授权)
            //context.ParticipateEvent("eventId");
            // 对活动感兴趣(需要授权)
            // context.FollowEvent("eventId");
            // 退出活动(需要授权)
            // context.QuitEvent("eventId");
            // 删除活动(需要授权)
            // context.DeleteEvent("eventId", "reason");
            // 回复推荐
            // context.CommentOnReco("recommendId", "content");
            // 删除推荐的回复
            // context.DeleteCommentOnReco("recommendId", commentId);
            // 批量设置豆油已读
            // context.SetMailsRead(string[] mails);
            // 批量删除豆油
            // context.DeleteMails(string[] mails);
            // 验证access token是否可用
            // context.IsTokenAvailabe(token);
            // 注销token
            // context.CancelToken(token);
        }
 
        /// <summary>
        /// 获取用户豆油(需要授权,只能看Me的)
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserMails(DoubanContext context)
        {
            // 未读邮件
            // context.Me.UnReadMails;
            // 已发邮件
            // context.Me.OutboxMails;
            foreach (var item in context.Me.Mails)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取用户所有推荐
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserRecos(DoubanContext context)
        {
            foreach (var item in context.Me.Recommends)
            {
                item.Title.Dump();
 
                //获取推荐回复
                foreach (var cc in item.Comments)
                {
                    cc.Title.Dump();
                }
            }
        }
 
        /// <summary>
        /// 获取指定城市id的活动
        /// </summary>
        /// <param name="context"></param>
        private static void GetLocationEvents(DoubanContext context)
        {
            var events =
                (from e in context.Events
                 where e.Location.ID == "beijing"
                 select e).Take(10);
 
            foreach (var item in events)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取指定用户所有活动
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserEvents(DoubanContext context)
        {
            // 用户参与的活动
            //context.Me.ParticipateEvents
            // 用户感兴趣的活动
            //context.Me.WishEvents
            // 用户发起的活动
            //context.Me.InitiateEvents
            foreach (var item in context.Me.Events)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取用户所有日记(延迟加载)
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserNotes(DoubanContext context)
        {
            foreach (var item in context.Me.Notes)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取指定用户广播
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserMiniBlogs(DoubanContext context)
        {
            var user = context.Peoples.GetByID("ahbei");
 
            foreach (var item in user.MiniBlogs)
            {
                item.Title.Dump();
 
                // 获取广播回复
                foreach (var c in item.Comments)
                {
                    c.Title.Dump();
                }
            }
        }
 
        /// <summary>
        /// 获取友邻广播
        /// </summary>
        /// <param name="context"></param>
        private static void GetContactMiniBlogs(DoubanContext context)
        {
            foreach (var item in context.Me.ContactMiniBlogs)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取指定用户收藏
        /// </summary>
        /// <remarks>
        /// 此处以Me为例,也可以换成查询得来的People。当访问这些属性时,会自动加载数据
        /// </remarks>
        /// <param name="context"></param>
        private static void GetPeopleCollections(DoubanContext context)
        {
            // 获取音乐收藏
            // context.Me.Musics
            // 获取电影收藏
            // context.Me.Movies
            // 获取书籍搜藏
            foreach (var item in context.Me.Books)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 删除指定id的评论
        /// </summary>
        /// <param name="context"></param>
        private static void DeleteReview(DoubanContext context)
        {
            // 代码中的id更换为有效id
            var review = context.Reviews.GetByID("2902263");
            context.Reviews.Delete(review.ID);
        }
 
        /// <summary>
        /// 更新指定的id的评论
        /// </summary>
        /// <param name="context"></param>
        private static void UpdateReview(DoubanContext context)
        {
            // 代码中的id更换为有效id
            var review = context.Reviews.GetByID("2902263");
            review.Content = "Udpat content test for linq2douban";
            context.Reviews.Update(review.ID, review);
        }
 
        /// <summary>
        /// 发表评论
        /// </summary>
        /// <remarks>
        /// 发表短的Content内容,douban api会报失败
        /// </remarks>
        /// <param name="context"></param>
        private static void AddReview(DoubanContext context)
        {
            var review = new Review
            {
                // 如果Subject是从API读回来的,Source属性会自动赋值
                Subject = new Movie { Source = "http://api.douban.com/movie/subject/1424406" },
                Rating = new Rating { Value = 4 },
                Content = "this is the test for linq2doubanddddddddddddddddddddddddddddddddddddddddd",
                Title = "this is the test for linq2douban"
            };
 
            context.Reviews.Insert(review);
        }
 
        /// <summary>
        /// 获取指定书籍/电影/音乐的评论
        /// </summary>
        /// <param name="context"></param>
        private static void GetSubjectReviews(DoubanContext context)
        {
            var movie = context.Movies.GetByID("1424406");
            movie.Reviews.Count().Dump();
        }
 
        /// <summary>
        /// 获取用户所有评论
        /// </summary>
        /// <remarks>
        /// 此例用me做示例,获取指定的用户的评论,访问People.Reviews属性即可,框架会延迟加载
        /// </remarks>
        /// <param name="context"></param>
        private static void GetReviews(DoubanContext context)
        {
            foreach (var item in context.Me.Reviews)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 示例复合查询(关键字,startindex,maxtresult)
        /// </summary>
        /// <remarks>
        /// douban的startindex, maxresult的含义与常识理解不通,
        /// douban的maxresult表示取回数据的最大下标,所以Take(20).Skip(10)返回下标为10-20共11条数据
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBooks(DoubanContext context)
        {
            var query = context.Books.Has("新东方").Take(20).Skip(10);
 
            foreach (var item in query)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 用多个条件查询书籍(电影、音乐等,查询同此例)
        /// </summary>
        /// <remarks>
        /// LINQToolKit会根据queries.config里定义的query rules转换成相应的url进行查询,
        /// 你可尝试用不同关键字匹配,如果有问题请发chwkai@gmail.com
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBooksByQuery(DoubanContext context)
        {
            var query =
                from b in context.Books
                where b.LongIsbn == "9787543639133" || b.ID == "2023013"
                select b;
 
            foreach (var item in query)
            {
                item.Title.Dump();
            }
        }
 
        /// <summary>
        /// 获取指定ID的书籍
        /// </summary>
        /// <remarks>
        /// 获取指定ID的douban信息与此例相同
        /// </remarks>
        /// <param name="context"></param>
        private static void GetBookByID(DoubanContext context)
        {
            var query =
                from b in context.Books
                where b.ID == "2023013"
                select b;
            query.Single().Dump();
        }
 
        /// <summary>
        /// 获取用户关注的人(延迟加载)
        /// </summary>
        /// <param name="context"></param>
        private static void GetContacts(DoubanContext context)
        {
            // context.Me.Contacts 获取当前用户关注的人
 
            var query =
                from p in context.Peoples
                where p.ID == "chwkai"
                select p;
 
            // People.Contacts 当需要访问时会延迟加载
            query.Single().Contacts.Count().Dump();
        }
 
        /// <summary>
        /// 获取用户朋友(延迟加载)
        /// </summary>
        /// <param name="context"></param>
        private static void GetFriends(DoubanContext context)
        {
            // context.Me.Friends 获取当前用户的朋友
 
            var query =
                from p in context.Peoples
                where p.ID == "chwkai"
                select p;
 
            // People.Friends 当需要访问时会延迟加载
            query.Single().Friends.Count().Dump();
        }
 
        /// <summary>
        /// 关键字搜索用户
        /// </summary>
        /// <remarks>
        /// 不是ID的相等比较条件都会转换为关键字查询
        /// </remarks>
        /// <param name="context"></param>
        private static void GetUserByKey2(DoubanContext context)
        {
            var query =
                from p in context.Peoples
                where p.Title == "net"
                select p;
            query.Count().Dump();
        }
 
        /// <summary>
        /// 关键字搜索用户
        /// </summary>
        /// <param name="context"></param>
        private static void GetUserByKey(DoubanContext context)
        {
            var query = context.Peoples.Has("net");
            query.Count().Dump();
        }
 
        /// <summary>
        /// 获取当前用户(需要授权)
        /// </summary>
        /// <param name="context"></param>
        private static void GetCurrentUser(DoubanContext context)
        {
            context.Me.Content.Dump();
        }
 
        /// <summary>
        /// 获取单个用户信息
        /// </summary>
        /// <param name="context"></param>
        private static void GetOneUserLinqStyle(DoubanContext context)
        {
            var user =
                from u in context.Peoples
                where u.ID == "chwkai"
                select u;
            user.Single().Content.Dump();
        }
 
        /// <summary>
        /// 获取单个用户信息
        /// </summary>
        /// <param name="context"></param>
        private static void GetOneUser(DoubanContext context)
        {
            var user = context.Peoples.GetByID("chwkai");
            user.Content.Dump();
        }
posted @   海南K.K  阅读(2408)  评论(6编辑  收藏  举报
点击右上角即可分享
微信分享提示