2017-05-29 84 views
1

我的控制器有點問題。我有一個數據庫充滿了來自FIFA的球員(PlayersK作爲關鍵,名稱和評級)。 在我playercontroller.cs我可以用http://localhost:63991/xyz使用Visual Studio 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(); 
     } 

這給了我同樣的結果與第一個,一個JSON/XML(取決於我的瀏覽器)與完整的表,而不是一個過濾之一。

我在想什麼?

+0

您可以嘗試使用'localhost:63991/api/player/yourplayername'或'localhost:63991/api/player?playername = yourplayername' –

回答

0

我相信你有可選id參數在應用程序中只有缺省路由

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

因此id是可選的,當id不會出現在請求這條路仍處於選中狀態。並且您的球員名稱請求被映射到api/player路線,該路線返回所有球員。

您應該創建一個含playername參數的路由。最簡單的方法是路由屬性。

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

不要忘記啓用屬性配置:

httpConfig.MapHttpAttributeRoutes(); 

注:返回其中包含給定的名稱x.Name.Contains(playername)會導致一個問題,這是包含在其他名稱的名稱的第一個球員 - 例如Herman包含在Hermannsson中。甚至更多 - 玩家名稱不是唯一的東西,它不能用作玩家實體的身份。兩人擁有相同的姓名完全可以。所以我相信api/player/playername端點應該會返回一組玩家。另外按照慣例cotroller名稱應該是複數形式:api/players/42