2017-05-29 17 views
1

私のコントローラに少し問題があります。私はfifaのプレーヤー(キー、名前、評価としてPlayersk)でいっぱいのデータベースを持っています。私playercontroller.csで 私はhttp://localhost:63991/xyzを使用して、うまくビジュアルスタジオweb api linqの問題

// GET: api/Player 
     public IEnumerable<Player> Get() 
     { 
      DataClasses1DataContext db = new DataClasses1DataContext(); 
      return db.Players; 
     } 

//GET: api/Player/3 
     public Player Get(int id) 
     { 
      DataClasses1DataContext db = new DataClasses1DataContext(); 
      return db.Players.Where(x => x.Playersk == id).FirstOrDefault(); 
     } 

を使用することができます。 しかし、私は彼らの名前ではなく、彼らのIDを使用する必要があります。私はこれにこだわっている:

//GET: api/Player/Beckenbauer 
     public Player Get(string playername) 
     { 
      DataClasses1DataContext db = new DataClasses1DataContext(); 
      return db.Players.Where(x => x.Name.Contains(playername)).FirstOrDefault(); 
     } 

これは私の完全な表ではなくフィルタ1との最初の1、JSON/XML(私のブラウザによって異なります)と同じ結果になります。

何が欠けていますか?私はオプションのidパラメータを使用してアプリケーション内の唯一のデフォルトルートを持っていると信じてい

+0

'localhost:63991/api/player/yourplayername'または' localhost:63991/api/player?playername = yourplayername'を試してみてください。 –

答えて

0

httpConfig.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
) 

したがってididがリクエストに存在しない場合に、このルートが選択されている、任意です。そしてプレーヤー名のあなたの要求はすべてのプレーヤーを返すapi/playerルートにマップされます。

playernameパラメータのルートを作成する必要があります。これを行う最も簡単な方法はルート属性です。

[Route("api/player/{playername}")] 
public Player Get(string playername) 

属性の設定を有効にすることを忘れないでください:

httpConfig.MapHttpAttributeRoutes(); 

注:指定された名前x.Name.Contains(playername)が含まれている最初のプレーヤーを返す他の名前に含まれている名前の問題が発生します - 例えばHermannssonにはHermanが含まれています。それ以上に、プレーヤー名はユニークなものではなく、プレーヤーエンティティのアイデンティティとして使用することはできません。 2人が同じ名前を持つことは全く問題ありません。だから私はapi/player/playernameエンドポイントが選手のコレクションを返すと信じています。また、慣習的には、番号はapi/players/42の複数形でなければなりません。

関連する問題