2013-06-26 2 views
0

У меня есть контроллер WebAPI, полученный из ApiController, который имеет операции службы:Добавление вручную определенные сервисные операции внутри initService для OData службы

public class Airports2Controller : ApiController 
    { 
     protected airportEntities db = new airportEntities(); 

     [Queryable] 
     [HttpGet] 
     public IQueryable<Airport> GetAirportsWithinRadius(int airportId, int radius) 
     { 
      //var radius = (int)parameters["radius"]; 
      //var airportId = (int)parameters["airportId"]; 

      var resultAirports = GetAirportsWithinRadius2(airportId, radius); 

      return resultAirports;    
     } 


     private IQueryable<Airport> GetAirportsWithinRadius2(int airportId, int radius) 
     { 
      var airports = db.Airports.SqlQuery("select * from Airport a where (select GeoLocation from airport where Id = @p0).STDistance(a.GeoLocation)/1.852/1000.00 < @p1", airportId, radius); 

      var airportIds = airports.Select(a => a.Id); 
      var resultAirports = db.Airports.Where(a => airportIds.Contains(a.Id)); 

      return resultAirports; 
     } 
    } 

У меня также есть обслуживание OData для объекта аэропорта. Поскольку .net webapi odata еще не поддерживает функции odata (служебные операции?), Мне нужно было создать дополнительный контроллер (который не был получен из ODataController).

То, что я хочу сделать сейчас с jaydata чтобы расширить контекст, чтобы иметь операцию службы в дополнение к OData вещи, когда дб инициализируется в initService:

$data.initService("http://localhost:2663/odata"); 
      service.then(function (db) { 
     //now here manually extend the definition of the context to include the GetAirportsWithinRadius service operation. 
}); 

}

Этот контроллер прекрасно работает с параметрами get и возвращает правильный json, когда вручную вызывается из fiddler. Как расширить контекст jaydata, чтобы получить метод GetAirportsWithinRadius (airportId, radius)? Его url необходимо будет установить вручную, и его тип необходимо будет изменить на GET. Кроме того, будет ли этот метод скомпонован с параметрами odata, поскольку он объявлен с помощью [Queryable]. Опять же, эта часть его работает, когда вручную вызывается в скрипаче. Например:

http://localhost:2663/api/Airports2/GetAirportsWithinRadius?airportId=2112&radius=50&?$inlinecount=allpages&$top=2 

Это возвращает два сущности аэропорта объекты хорошо ...

Благодарности

+0

Эй, можно ли опубликовать свою логику как действие OData Web API? Вы можете вызывать действия уровня сущности и уровня сущности -http: //jaydata.org/blog/calling-odata-actions-and-service-operations-with-jaydata – Robesz

ответ

1

Благодаря @robesz - есть некоторые тонкости в создании параметризованного OData действий в .net, и это то, что есть был преследующим меня (я пробовал действия до просто не мог заставить его работать), но на этот раз я получил его:

[Queryable] 
     [HttpPost] 
     public IQueryable<Airport> GetAirportsWithinRadius([FromBody] ODataActionParameters parameters) 
     { 
      if (!ModelState.IsValid) 
      { 
       throw new HttpResponseException(HttpStatusCode.BadRequest); 
      } 
      var radius = (int)parameters["radius"]; 
      var airportId = (int)parameters["airportId"]; 

      var resultAirports = GetAirportsWithinRadius2(airportId, radius); 

      return resultAirports;    
     } 

ActionConfiguration getAirportsWithinRadius = modelBuilder.Entity<Airport>().Collection.Action("GetAirportsWithinRadius"); 
      getAirportsWithinRadius.Parameter<int>("airportId"); 
      getAirportsWithinRadius.Parameter<int>("radius"); 
      getAirportsWithinRadius.ReturnsCollectionFromEntitySet<Airport>("Airports"); 

с этим на месте я могу теперь сделать последующее ING с jaydata:

var service = $data.initService("http://localhost:2663/odata"); 
     return service.then(function (db) { 
      airports = db.Airports.GetAirportsWithinRadius(2112,50); 
      airports.filter("it.Abbrev== a", {a: 'C44'}).forEach(function(a){console.log(a.Abbrev)}); 
    }); 

Я прыгать вверх и вниз в радости :)

+0

Вау! Удивительно, поздравляю! :) – Robesz