0

サービス操作を持つ ApiController から派生した WebApi コントローラーがあります。

 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;
        }
    }

Airport エンティティ用の odata サービスもあります。.net webapi odata はまだ odata 関数 (サービス操作?) をサポートしていないため、セカンダリ コントローラー (ODataController から派生したものではない) を作成する必要がありました。

jaydata で今やりたいことは、initService でデータベースが初期化されたら、コンテキストを拡張して、odata に加えてサービス操作を行うことです。

$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 パラメーターとうまく連携し、fiddler から手動で呼び出すと正しい json を返します。GetAirportsWithinRadius(airportId,radius) メソッドを持つように jaydata コンテキストを拡張するにはどうすればよいですか? その URL は手動で設定する必要があり、そのタイプは GET に変更する必要があります。また、そのメソッドは [Queryable] で宣言されているため、odata パラメータで構成可能になります。繰り返しますが、その部分は、フィドラーで手動で呼び出すと機能します。例えば:

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

これにより、2 つの空港エンティティ オブジェクトが適切に返されます...

ありがとう

4

1 に答える 1

1

ありがとう@robesz - .netでパラメータ化されたodataアクションを作成する際にいくつかの微妙な点がありました.これが私を悩ませていたものです.

 [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");

これで、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)});
    });

私は喜びで飛び跳ねています:)

于 2013-06-27T16:53:36.453 に答える