2015-12-02 2 views
0

У меня есть проблема с $expand пункта:
Это работает ->api/Components('XYZ')/Childs
Это не делает ->api/Components('XYZ')?$expand=Childs

я использовал EntityFramework (6.1.3) для отображения представлений в базе данных (только для чтения), а затем созданных контроллеров OData v3 на основе объектов EF. Он отлично работает для большинства таблиц, но проблема возникает, когда связь между объектами не основана на свойства навигации, а на запросе 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:

Здесь $ метаданных - свойство навигации «Пользователи» работает с $ расширяться, но «Чайлдс» нет:

<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

Странно, что $ expand поддерживается уже. Не могли бы вы показать метаданные? –

+0

@SamXu Я добавил метаданные – micmax93

+0

использование используя mvc api .... как вы его потребляете, angularjs? т.е. то, что вызывает GetChilds .... как выглядит js. – Seabizkit

ответ

0

Вы не можете ожидать GetChilds(string) вызывается для запроса

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

в противном случае, реальный метод должен быть вызван в контроллере Get(string) для вышеупомянутого запроса.

С другой стороны, GetChilds(string) используется только для api/Components('XYZ')/Childs.

Я написал образец проекта для тестирования. вы можете сослаться на него here, чтобы понять маршрутизацию для odata. Благодарю.

Смежные вопросы