- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.NET Core开发日志之OData(Open Data Protocol)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
简述 。
OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API.
类库 。
在.NET Core中想要使用OData功能的话需要添加Microsoft.AspNetCore.OData包.
1
|
dotnet add package Microsoft.AspNetCore.OData
|
准备模型类 。
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
|
public
class
Address
{
public
string
City {
get
;
set
; }
public
string
Street {
get
;
set
; }
}
public
enum
Category
{
Book,
Magazine,
EBook
}
public
class
Press
{
public
int
Id {
get
;
set
; }
public
string
Name {
get
;
set
; }
public
string
Email {
get
;
set
; }
public
Category Category {
get
;
set
; }
}
public
class
Book
{
public
int
Id {
get
;
set
; }
public
string
ISBN {
get
;
set
; }
public
string
Title {
get
;
set
; }
public
string
Author {
get
;
set
; }
public
decimal
Price {
get
;
set
; }
public
Address Address {
get
;
set
; }
public
Press Press {
get
;
set
; }
}
|
创建Edm模型 。
OData使用EDM,即Entity Data Model来描述数据的结构。在Startup文件中添加创建方法.
1
2
3
4
5
6
7
|
private
static
IEdmModel GetEdmModel()
{
var builder =
new
ODataConventionModelBuilder();
builder.EntitySet<Book>(
"Books"
);
builder.EntitySet<Press>(
"Presses"
);
return
builder.GetEdmModel();
}
|
注册OData服务 。
在Startup文件的ConfigureServices方法里注册OData服务.
1
2
3
4
5
|
services.AddOData();
services.AddMvc(options =>
{
options.EnableEndpointRouting =
false
;
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
这里要注意的是在.NET Core 2.2里,默认已经有终结点,所以要使用OData的终结点的话需要将默认选项禁用掉.
注册OData终结点 。
同样在Startup文件里,在其Configure方法内将原来的注册路由内容改为注册OData的终结点.
1
2
3
4
|
app.UseMvc(b =>
{
b.MapODataServiceRoute(
"odata"
,
"odata"
, GetEdmModel());
});
|
显示元数据 。
运行程序后访问https://localhost:5001/odata/$metadata地址,可以看到所有可用模型的元数据.
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
|
<
edmx:Edmx
xmlns:edmx
=
"http://docs.oasis-open.org/odata/ns/edmx"
Version
=
"4.0"
>
<
edmx:DataServices
>
<
Schema
xmlns
=
"http://docs.oasis-open.org/odata/ns/edm"
Namespace
=
"Default"
>
<
EntityType
Name
=
"Book"
>
<
Key
>
<
PropertyRef
Name
=
"Id"
/>
</
Key
>
<
Property
Name
=
"Id"
Type
=
"Edm.Int32"
Nullable
=
"false"
/>
<
Property
Name
=
"ISBN"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Title"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Author"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Price"
Type
=
"Edm.Decimal"
Nullable
=
"false"
/>
<
Property
Name
=
"Address"
Type
=
"Default.Address"
/>
<
NavigationProperty
Name
=
"Press"
Type
=
"Default.Press"
/>
</
EntityType
>
<
EntityType
Name
=
"Press"
>
<
Key
>
<
PropertyRef
Name
=
"Id"
/>
</
Key
>
<
Property
Name
=
"Id"
Type
=
"Edm.Int32"
Nullable
=
"false"
/>
<
Property
Name
=
"Name"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Email"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Category"
Type
=
"Default.Category"
Nullable
=
"false"
/>
</
EntityType
>
<
ComplexType
Name
=
"Address"
>
<
Property
Name
=
"City"
Type
=
"Edm.String"
/>
<
Property
Name
=
"Street"
Type
=
"Edm.String"
/>
</
ComplexType
>
<
EnumType
Name
=
"Category"
>
<
Member
Name
=
"Book"
Value
=
"0"
/>
<
Member
Name
=
"Magazine"
Value
=
"1"
/>
<
Member
Name
=
"EBook"
Value
=
"2"
/>
</
EnumType
>
<
EntityContainer
Name
=
"Container"
>
<
EntitySet
Name
=
"Books"
EntityType
=
"Default.Book"
>
<
NavigationPropertyBinding
Path
=
"Press"
Target
=
"Presses"
/>
</
EntitySet
>
<
EntitySet
Name
=
"Presses"
EntityType
=
"Default.Press"
/>
</
EntityContainer
>
</
Schema
>
</
edmx:DataServices
>
</
edmx:Edmx
>
|
创建Controller 。
本文实例中不考虑数据库的操作,故而使用hard 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
|
public
class
BooksController : ODataController
{
private
static
IList<Book> Books {
get
;
set
;}
public
BooksController()
{
Books =
new
List<Book>
{
new
Book
{
Id = 1,
ISBN =
"111-0-321-56789-1"
,
Title =
"Calculus"
,
Price = 66.6m,
Address =
new
Address
{
City =
"Shanghai"
,
Street =
"Beijin Xi Road"
},
Press =
new
Press
{
Id = 1,
Name =
"Shanghai Tongji"
,
Category = Category.Book
}
},
new
Book
{
Id = 2,
ISBN =
"222-2-654-00000-2"
,
Title =
"Linear Algebra"
,
Price = 53.2m,
Address =
new
Address
{
City =
"Shanghai"
,
Street =
"Beijin Dong Road"
},
Press =
new
Press
{
Id = 2,
Name =
"Shanghai Fudan"
,
Category = Category.EBook
}
}
};
}
[EnableQuery]
public
IActionResult Get()
{
return
Ok(Books);
}
[EnableQuery]
public
IActionResult Get(
int
key)
{
return
Ok(Books.FirstOrDefault(b => b.Id == key));
}
}
|
EnableQuery特性在需要高级查询的场景时必须添加.
查询 。
加入Controller之后,访问https://localhost:5001/odata/Books地址,可得到所有Book数据.
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
|
{
"@odata.context"
:
"https://localhost:5001/odata/$metadata#Books"
,
"value"
: [
{
"Id"
: 1,
"ISBN"
:
"111-0-321-56789-1"
,
"Title"
:
"Calculus"
,
"Author"
:
null
,
"Price"
: 66.6,
"Address"
: {
"City"
:
"Shanghai"
,
"Street"
:
"Beijin Xi Road"
}
},
{
"Id"
: 2,
"ISBN"
:
"222-2-654-00000-2"
,
"Title"
:
"Linear Algebra"
,
"Author"
:
null
,
"Price"
: 53.2,
"Address"
: {
"City"
:
"Shanghai"
,
"Street"
:
"Beijin Dong Road"
}
}
]
}
|
访问https://localhost:5001/odata/Books(1)地址,可得到key值为1的Book数据.
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"@odata.context"
:
"https://localhost:5001/odata/$metadata#Books/$entity"
,
"Id"
: 1,
"ISBN"
:
"111-0-321-56789-1"
,
"Title"
:
"Calculus"
,
"Author"
:
null
,
"Price"
: 66.6,
"Address"
: {
"City"
:
"Shanghai"
,
"Street"
:
"Beijin Xi Road"
}
}
|
高级查询 。
如果想要使用OData查询的高级功能,可以在注册终结点时额外加上相应的配置.
1
2
3
4
5
|
app.UseMvc(b =>
{
b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
b.MapODataServiceRoute(
"odata"
,
"odata"
, GetEdmModel());
});
|
访问网址时加上所需的查询内容: https://localhost:5001/odata/Books?$select=Id,Title 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"@odata.context"
:
"https://localhost:5001/odata/$metadata#Books(Id,Title)"
,
"value"
: [
{
"Id"
: 1,
"Title"
:
"Calculus"
},
{
"Id"
: 2,
"Title"
:
"Linear Algebra"
}
]
}
|
如果想要按特定条件过滤数据内容的话也很容易: https://localhost:5001/odata/Books?$filter=Price%20le%2060 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{
"@odata.context"
:
"https://localhost:5001/odata/$metadata#Books"
,
"value"
: [
{
"Id"
: 2,
"ISBN"
:
"222-2-654-00000-2"
,
"Title"
:
"Linear Algebra"
,
"Author"
:
null
,
"Price"
: 53.2,
"Address"
: {
"City"
:
"Shanghai"
,
"Street"
:
"Beijin Dong Road"
}
}
]
}
|
总结 。
不难看出,OData的真正魅力在于其对那些高级查询功能的支持,所以在创建RESTful API时,不妨考虑使用OData,这样应该能减少许多不必要的代码工作.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://www.cnblogs.com/kenwoo/p/10360260.html 。
最后此篇关于.NET Core开发日志之OData(Open Data Protocol)的文章就讲到这里了,如果你想了解更多关于.NET Core开发日志之OData(Open Data Protocol)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
OpenAL.org && 创意开发网站已关闭。我选择替代版本 OpenAL Soft .我很担心,因为在 OpenAL Soft 的二进制安装中我找不到 alut.h header 。 alut.h
我使用 Android Studio 已经有一段时间了,但有一天应用程序突然出错了。当我尝试单击我的目录以查找要导入或打开的文件时,应用程序变得异常缓慢并且根本没有响应。当我最终成功切换到存储我的文件
自 Firefox 4 以来,这似乎是一个奇怪的功能变化。在使用 window.open() 打开一个窗口后,当用鼠标中键单击打开的窗口中的链接时(或右键单击并选择“在新窗口中打开”选项卡') 导致链
我无法从 Open::URI 的 rdoc 中得知当我这样做时返回的是什么: result = open(url) URL 返回 XML,但我如何查看/解析 XML? 最佳答案 open 返回一个 I
经常开发asp但对于细致的说法,真实不太清楚,这里简单的介绍下。 一般情况下 读取数据都是用rs.open sql,conn,1,1 修改数据:rs.open sql,conn,1,3 删除
关于 pathlib 标准库中的模块,是 path.open() 方法只是内置 open() 的“包装器”功能? 最佳答案 如果您阅读了 source code的 pathlib.Path.open你
我想将 Open Liberty 运行时的语言更改为 en_US从 Eclipse IDE 中,但我不知道如何。 也尝试使用 JVM 参数的首选项来设置它,但它没有用。 -Duser.language
这是我所拥有的: 参数“opener”未在可能的函数调用参数中列出。这是 PyCharm 错误还是其他原因? PyCharm 2018.3.5 社区版,Windows 7 上的 Python 3.6.
我正在使用 Tinkerpop 的 GraphFactory.open(Configuration 配置) Java 命令来访问 Neo4j 数据库。 一个最低限度的工作示例是: Configurat
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 我没有使用过 with 语句,但
我正在玩 python 3.5 中的 open 函数。我不明白 opener 参数(最后一个参数)在 open 函数中的用法。根据 python 文档:可以通过将可调用对象作为打开器传递来使用自定义打
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我试图用 Python 来做一些模拟 3D 声音的工作。我试图运行此代码(答案中提供):Python openAL 3D sound类似,两次都收到: ModuleNotFoundError: No
我一直认为 open 和 io.open 可以互换。 显然不是,如果我相信这个片段: import ctypes, io class POINT(ctypes.Structure): _fie
这个问题在这里已经有了答案: What's the difference between io.open() and os.open() on Python? (7 个答案) 关闭 9 年前。 我是
我正在尝试更好地了解 WCF 的一些内部工作原理。我已经做了相当多的环顾四周,但我无法找到关于 ChannelFactory.Open() 与 IClientChannel.Open() 相比的明确解
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 我知道有很多关于在 python
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章adodb.recordset.open(rs.open)方法参数详解由
不久前我遇到了一个interesting security hole Link 看起来足够无害,但有一个漏洞,因为默认情况下,正在打开的页面允许打开的页面通过 window.opener 回调到它。有
这在我的应用程序上运行良好,但由于某种原因我无法让它在这里正常工作。无论如何,我的问题是,当我单击列表标题时,我想关闭之前打开的列表标题并仅保留事件的列表标题打开。目前它会打开我点击的所有内容,但也会
我是一名优秀的程序员,十分优秀!