2017-05-29 65 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