仅适用于$ expand - LINQ to Entities不支持成员

时间:2015-12-02 12:24:06

标签: c# entity-framework asp.net-web-api odata

我对$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

EDIT1:

这是$ 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>

1 个答案:

答案 0 :(得分:0)

您不能指望为请求调用GetChilds(string)

api/Components('XYZ')?$expand=Childs

否则,对于上述请求,应在控制器Get(string)中调用实际方法。

另一方面,GetChilds(string)仅用于api/Components('XYZ')/Childs

我写了一个示例项目进行测试。您可以参考here来了解odata的路由。感谢。