Entity Framework技巧系列之十四 - Tip 56
提示56. 使用反射提供程序编写一个OData Service
在TechEd我收到一大堆有关将数据作为OData暴露的问题。
到目前为止你大概知道可以使用数据服务与Entity Framework将数据库中的数据暴露为一个OData服务。你可能还知道你可以在数据服务中使用一个自定义的数据服务提供程序来由任意地方暴露任意数据。
但是你了解数据服务反射提供程序吗?
事实上反射提供程序的使用非常简单。
我将创建一个OData服务暴露一些内存中的数据来展示这有多么容易。
首先你需要一些数据,这部分数据如何:

1 [EntityPropertyMapping("Name",
2 SyndicationItemProperty.Title,
3 SyndicationTextContentKind.Plaintext,
4 false)]
5 [EntityPropertyMapping("Odds",
6 SyndicationItemProperty.Summary,
7 SyndicationTextContentKind.Plaintext,
8 false)]
9 public class Team {
10 public static List<Team> Teams = new List<Team>{
11 new Team {ID = 1, Name = "New Zealand", Odds = "1:1000"},
12 new Team {ID = 2, Name = "Paraquay", Odds = "1:50"},
13 … };
14
15 public int ID{get;set;}
16 public string Name {get;set;}
17 public string Odds { get; set; }
18 }
19 [DataServiceKey("Name")]
20 [EntityPropertyMapping("Name",
21 SyndicationItemProperty.Title,
22 SyndicationTextContentKind.Plaintext,
23 false)]
24 public class Group
25 {
26 public static List<Group> Groups = new List<Group>{
27 new Group {
28 Name = "A",
29 Teams = new List<Team>{
30 Team.Teams[0],
31 Team.Teams[1],
32 Team.Teams[2],
33 Team.Teams[3]
34 }
35 },
36 new Group {
37 Name = "B",
38 Teams = new List<Team>{
39 Team.Teams[4],
40 Team.Teams[5],
41 Team.Teams[6],
42 Team.Teams[7]
43 }
44 },
45 …
46 };
47 public string Name {get;set;}
48 public List<Team> Teams {get;set;}
49 }

注意[DataServiceKey]与[EntityPropertyMapping]特性的使用:
- [DataServiceKey]通知Data Services那个(些)属性是键。这个仅当
- [EntityPropertyMapping]通知Data Services将属性映射到一个标准的atom元素。这不是必须得-但这是一个最佳实践-它使浏览器中最终的源数据更易读。
下一步你需要一个类来扮演数据源。数据服务将暴露所有的IQueryable属性为源数据,并且推断出所有这些源数据暴露的类型所用到的类型。
所以如果我想要两个源,以暴露来自世界杯团体和小组,我将这样做:

1 public class WorldCupData
2 {
3 public IQueryable<Team> Teams{
4 get{
5 return Team.Teams.AsQueryable();
6 }
7 }
8 public IQueryable<Group> Groups{
9 get{
10 return Group.Groups.AsQueryable();
11
12 }
13 }
14 }

现在所有需要做的就是创建Data Service,并暴露出我们的数据集。只需向Web应用中添加一个WCF数据服务,并将自动生成的代码修改成如下这样:

1 public class WorldCup : DataService<WorldCupData>
2 {
3 // This method is called only once to initialize service-wide policies.
4 public static void InitializeService(DataServiceConfiguration config) {
5 config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
6 config.SetEntitySetPageSize("*", 100);
7 config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
8 }
9 }

完成后如下这样:

一些需要注意的点:
这个服务是只读的。如果你想要使它可写,你需要实现IDataServiceUpdateProvider接口。
在这个例子中,数据来自内存中的数组,然而如果你的数据源支持IQueryable接口,你的数据可以来自任何地方。
是的我知道这些数据都是错的,我正在新奥尔良到丹佛的西南航空的航班上,在没有互联网的情况下完成这些。谢天谢地这里有一个真实的世界杯OData Service。
编码愉快。
Entity Framework技巧系列之十四 - Tip 56的更多相关文章
- Entity Framework技巧系列之十二 - Tip 46 - 50
提示46. 怎样使用Code-Only排除一个属性 这次是一个真正简单的问题,由StackOverflow上这个问题引出. 问题: 当我们使用Code-Only把一个类的信息告诉Entity F ...
- (翻译)Entity Framework技巧系列之十 - Tip 37 - 41
提示37. 怎样进行按条件包含(Conditional Include) 问题 几天前有人在StackOverflow上询问怎样进行按条件包含. 他们打算查询一些实体(比方说Movies),并且希望预 ...
- Entity Framework技巧系列之十 - Tip 37 - 41
提示37. 怎样进行按条件包含(Conditional Include) 问题 几天前有人在StackOverflow上询问怎样进行按条件包含. 他们打算查询一些实体(比方说Movies),并且希望预 ...
- Entity Framework技巧系列之五 - Tip 16 – 19
提示16. 当前如何模拟.NET 4.0的ObjectSet<T> 背景: 当前要成为一名EF的高级用户,你确实需要熟悉EntitySet.例如,你需要理解EntitySet以便使用 At ...
- Entity Framework技巧系列之六 - Tip 20 – 25
提示20. 怎样处理固定长度的主键 这是正在进行中的Entity Framework提示系列的第20篇. 固定长度字段填充: 如果你的数据库中有一个固定长度的列,例如像NCHAR(10)类型的列,当你 ...
- Entity Framework技巧系列之十三 - Tip 51 - 55
提示51. 怎样由任意形式的流中加载EF元数据 在提示45中我展示了怎样在运行时生成一个连接字符串,这相当漂亮. 其问题在于它依赖于元数据文件(.csdl .ssdl .msl)存在于本地磁盘上. 但 ...
- Entity Framework技巧系列之十一 - Tip 42 - 45
提示42. 怎样使用Code-Only创建一个动态模型 背景: 当我们给出使用Code-Only的例子,总是由创建一个继承自ObjectContext的强类型的Context开始.这个类用于引导模型. ...
- Entity Framework技巧系列之八 - Tip 29 – 34
提示29. 怎样避免延迟加载或Load()阅读器问题 如果你有如下这样的代码: 1 var results = from c in ctx.Customers 2 where c.SalesPerso ...
- Entity Framework技巧系列之七 - Tip 26 – 28
提示26. 怎样避免使用不完整(Stub)实体进行数据库查询 什么是不完整(Stub)实体? 不完整实体是一个部分填充实体,用于替代真实的对象. 例如: 1 Category c = new Cate ...
随机推荐
- Java代码之输出参数和(强制类型转换)
说明(因为Java中java Application的参数都是默认的字符型的数据,所以需要强制类型转换这一步骤) 设计思想: 向系统里输入若干个参数,计算出参数个数,利用for语句计算出参数的和.(程 ...
- JS跨域访问问题
js跨域了. 只能给几个资料参考了:http://blog.csdn.net/lovingprince/article/details/2954675 http://www.kuqin.com/web ...
- 【MySQL】查询优化实例解析-延迟关联优化
[提出问题] 从数据表t通过分页查询的方式读取数据,读取时要根据a1排序.t有80万行记录,当OFFSET很大时,读取速度很慢.优化后查询速度提升很快. 下图是表的定义,一共有几十个字段,RowLen ...
- 学习前端前必知的——HTTP协议详解
前端人士必备的知识点,无论你是否有经验,看了此文绝对有收获 此文针对前端爱好者,前端求职者(话说面试时很容易考到哦) 原文参考博客园http://kb.cnblogs.com/page/130970/ ...
- HDU 3127 WHUgirls
二维完全背包,理解似乎还不够全面,过几天回来再看看这题. #include<cstdio> #include<cstring> #include<cmath> #i ...
- mysql 初始化修改密码问题(Mac系统)
今天公司大牛帮我搞定了mysql初始化密码问题,纪录一下: ~ ps aux | grep mysqlMetro 7149 0.0 0.0 2432772 564 s000 R+ 7:16下午 0:0 ...
- UEditor的jQuery插件化
UEditor本身并不依赖jQuery,但如果在项目中同时使用两者的话,可能会希望使用jQuery语法创建和获取编辑器实例.为此,需要为jQuery编写插件,代码如下: (function ($) { ...
- Apache Kafka开发入门指南(1)
Apache Kafka可以帮助你解决在发布/订阅架构中遇到消费数百万消息的问题.如今,商业应用.社交应用以及其它类型的应用产生的实时信息在不断增长,这些信息需要以简单的方式快速.可靠地路由到各种类型 ...
- 《高性能Javascript》读书笔记-3
第三章 DOM编程 把dom和js 各自想象为一个岛,他们之间用收费的桥梁链接,每次访问dom都必须途径这座桥收取过路费,访问次数多费用就高了.所有必须减少来往次数. innerHtml 与dom比较 ...
- 一行一行分析JQ源码学习笔记-03
rquickExpr: <p>aaaa 或 #div1 rsingieTag: rmsPrefix :/-ms-/ 是否是ie rdashAlpha = 转大小写 数字 (-2 ...