OData v7 和 8 - 键值绑定时复合键应该按 Alpha Order 还是 HasKey?
OData v7 & 8 - Should Composite Keys be in Alpha Order or HasKey when key value binding?
Odata 在使用键值绑定约定时似乎希望键按字母顺序排列。
下面的文档建议它应该按照 HasKeys 中定义的顺序,因为键不是按字母顺序排列的。
https://docs.microsoft.com/en-us/odata/webapi/key-value-binding
但如果我下载 https://github.com/OData/AspNetCoreOData
更改以下文件的第 19 行以在 HasKey 定义中切换 FirstName 和 LastName
https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/EdmModelBuilder.cs
调换人物模型文件中 2 个属性的顺序:
https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/Person.cs
并更改以下文件第 48 行中 2 个参数的顺序:
https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Controllers/PeopleController.cs
API 仍然期待 FirstName 优先:
这是预期的行为吗?
除了向 HttpGet 添加路由模板之外,我是否错过了确定键顺序的方法?
我更喜欢使用约定路由(HttpGet 中没有模板),我只是不确定是否有办法控制约定使用的键的顺序。
我正在将一个项目升级到 .Net 6、OData 8,我正在尝试将其移动到使用约定路由而不是模板指定路由,但目前的优先事项是保持路线相同。
链接到项目的是 .Net 5、OData 7,但我已经确认 .Net 6 和 OData 8 存在同样的问题。
这是 OData 模型构建器中的实现:
var keys = ((IEnumerable<PropertyConfiguration>)config.Keys)
.Concat(config.EnumKeys)
.OrderBy(p => p.Order)
.ThenBy(p => p.Name)
.Select(p => type.DeclaredProperties.OfType<IEdmStructuralProperty>().First(dp => dp.Name == p.Name));
它按 'Order' 属性 排序,然后按 属性 名称排序。
因此,您可以为 'Order' 设置不同的值以获得您想要的订单。
- 直接设置'Order'属性值
- 在 C# 属性 上使用 'ColumnAttribute' 属性。
已更新:
注意,在ODataRoutingSample中,FirstName
和LastName
是显式添加的(通过调用HasKey
fluent API),所以,'ColumnAttribute'将是忽略明确添加的 属性.
所以,您应该直接设置订单值。以下代码应该有效:
builder.EntitySet<Person>("People").EntityType.HasKey(c => new { c.FirstName, c.LastName });
builder.EntityType<Person>().Property(c => c.FirstName).Order = 2;
builder.EntityType<Person>().Property(c => c.LastName).Order = 1;
Odata 在使用键值绑定约定时似乎希望键按字母顺序排列。
下面的文档建议它应该按照 HasKeys 中定义的顺序,因为键不是按字母顺序排列的。 https://docs.microsoft.com/en-us/odata/webapi/key-value-binding
但如果我下载 https://github.com/OData/AspNetCoreOData
更改以下文件的第 19 行以在 HasKey 定义中切换 FirstName 和 LastName https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/EdmModelBuilder.cs
调换人物模型文件中 2 个属性的顺序: https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Models/Person.cs
并更改以下文件第 48 行中 2 个参数的顺序: https://github.com/OData/AspNetCoreOData/blob/main/sample/ODataRoutingSample/Controllers/PeopleController.cs
API 仍然期待 FirstName 优先:
这是预期的行为吗?
除了向 HttpGet 添加路由模板之外,我是否错过了确定键顺序的方法?
我更喜欢使用约定路由(HttpGet 中没有模板),我只是不确定是否有办法控制约定使用的键的顺序。
我正在将一个项目升级到 .Net 6、OData 8,我正在尝试将其移动到使用约定路由而不是模板指定路由,但目前的优先事项是保持路线相同。
链接到项目的是 .Net 5、OData 7,但我已经确认 .Net 6 和 OData 8 存在同样的问题。
这是 OData 模型构建器中的实现:
var keys = ((IEnumerable<PropertyConfiguration>)config.Keys)
.Concat(config.EnumKeys)
.OrderBy(p => p.Order)
.ThenBy(p => p.Name)
.Select(p => type.DeclaredProperties.OfType<IEdmStructuralProperty>().First(dp => dp.Name == p.Name));
它按 'Order' 属性 排序,然后按 属性 名称排序。 因此,您可以为 'Order' 设置不同的值以获得您想要的订单。
- 直接设置'Order'属性值
- 在 C# 属性 上使用 'ColumnAttribute' 属性。
已更新:
注意,在ODataRoutingSample中,FirstName
和LastName
是显式添加的(通过调用HasKey
fluent API),所以,'ColumnAttribute'将是忽略明确添加的 属性.
所以,您应该直接设置订单值。以下代码应该有效:
builder.EntitySet<Person>("People").EntityType.HasKey(c => new { c.FirstName, c.LastName });
builder.EntityType<Person>().Property(c => c.FirstName).Order = 2;
builder.EntityType<Person>().Property(c => c.LastName).Order = 1;