2015-10-02 4 views
0

У меня возникают проблемы с определением функции для odata4. По умолчанию get будет работать, но я хочу, чтобы был задан пользовательский параметр, поэтому можно определить набор клиентов, другие таблицы задействованы, поэтому LINQ требуется, я также возвращаю DTO вместо информации таблицы по умолчанию (EF). Ниже приведен код. Я получаю сообщение «Invalid EntitySetPath detected.» BindingParameter/Client 'не является допустимым путем установки объекта для процедуры «Default.GetClients». Что я здесь делаю неправильно?Web API 2 Odata 4 Параметр Issue

WebApiConfig

public static void Register(HttpConfiguration config) 
    { 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<client>("Client").EntityType.HasKey(p =>  p.int_id); 

     var function = builder.Function("GetClients"); 
     function.Parameter<string>("user"); 
     function.ReturnsCollectionFromEntitySet<client>("Client"); 

     builder.EntitySet<ClientDTO>("ClientDTO"); 

     config.MapODataServiceRoute(
      routeName: "ODataRoute", 
      routePrefix: null, 
      model: builder.GetEdmModel()); 

WebApp.Controller

[ODataRoute("GetClients(user={user})")] 
    [EnableQuery(PageSize=25)] 
    public IQueryable<ClientDTO> GetClients([FromODataUri] string user) 
    { 
     var clients = (from c in db.clients 
         join ... 

ответ

1

Если ваш контроллер OData возвращается в DTO, функция должна выглядеть следующим образом:

var function = builder.Function("GetClients"); 
    function.Parameter<string>("user"); 
    function.ReturnsCollectionFromEntitySet<ClientDTO>("Client"); 

С вашей текущей настройкой ваш маршрут OData GetClients говорит, что он возвращает объект ClientDTO, но ваш WebApiConfig заявляет, что вы возвращаете объект Client.

Поскольку возвращенная коллекция объектов фактически является DTO. Часть, которая показывает ("Client"), - это просто, как служба OData сообщит имя объекта проекту, использующему службу OData. Для моего собственного личного рассудка я обычно включаю DTO, поэтому я знаю, когда я использую DTO и когда я использую прямой объект. Поэтому в моей собственной настройке я бы вернул ("ClientDTO"), только личное предпочтение.

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