我对$expand
条款有疑问:
这有效 - > api/Components('XYZ')/Childs
这不 - > api/Components('XYZ')?$expand=Childs
我使用EntityFramework(6.1.3)在数据库中映射视图(只读),然后基于EF实体创建OData v3控制器。它适用于大多数表,但实体之间的关系不是基于导航属性而是基于LINQ查询时出现问题
这是代码示例:
public class ComponentsController : ODataController
{
....
[EnableQuery]
public IQueryable<Component> GetChilds([FromODataUri] string key)
{
var id = db.Components.First(c => c.Id == key).Identity;
return db.ChildComponents.Where(cc => cc.Identity == id).Select(cc => cc.Component);
}
我无法理解的是,当$expand=Childs
工作正常时我无法使用(...)/Childs
?
这是$ metadata - 导航属性“Users”使用$ expand但“Childs”不能:
<EntityType Name="Component">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.String" Nullable="false"/>
<Property Name="Type" Type="Edm.String"/>
<Property Name="Name" Type="Edm.String"/>
<Property Name="Identity" Type="Edm.String"/>
<NavigationProperty Name="Users" Relationship="HostingDb.Pandora.HostingDb_Pandora_Component_Users_HostingDb_Pandora_ComponentUser_UsersPartner" ToRole="Users" FromRole="UsersPartner"/>
<NavigationProperty Name="Childs" Relationship="HostingDb.Pandora.HostingDb_Pandora_Component_Childs_HostingDb_Pandora_Component_ChildsPartner" ToRole="Childs" FromRole="ChildsPartner"/>
</EntityType>
<Association Name="HostingDb_Pandora_Component_Users_HostingDb_Pandora_ComponentUser_UsersPartner">
<End Type="HostingDb.Pandora.ComponentUser" Role="Users" Multiplicity="*"/>
<End Type="HostingDb.Pandora.Component" Role="UsersPartner" Multiplicity="0..1"/>
</Association>
<Association Name="HostingDb_Pandora_Component_Childs_HostingDb_Pandora_Component_ChildsPartner">
<End Type="HostingDb.Pandora.Component" Role="Childs" Multiplicity="*"/>
<End Type="HostingDb.Pandora.Component" Role="ChildsPartner" Multiplicity="0..1"/>
</Association>
答案 0 :(得分:0)
您不能指望为请求调用GetChilds(string)
api/Components('XYZ')?$expand=Childs
否则,对于上述请求,应在控制器Get(string)
中调用实际方法。
另一方面,GetChilds(string)
仅用于api/Components('XYZ')/Childs
。
我写了一个示例项目进行测试。您可以参考here来了解odata的路由。感谢。