2016-05-30 3 views
0

Работает в веб-сервисе api restful.Web API Restful Service C# Выполнять SQL-запрос

У меня есть таблица под названием тесты. Первичный ключ - автоинкремент. Каждая строка содержит имя пользователя и тестовый вопрос. Эта БД на самом деле не оптимизирована, но это не обязательно.

Поскольку первичный ключ - это просто int, чтобы каждая строка была уникальной, существует много строк с повторяющимися именами пользователей. Это отлично.

Я хочу, чтобы иметь возможность возвращать все строки с совпадающим именем пользователя.

Я хочу, чтобы иметь возможность сделать это с помощью запроса GET с URL: www.mywebsite.com/api/tests/{username}

методов контроллера по умолчанию в Visual Studio только в состоянии поиска по первичный ключ, чтобы вернуть один уникальный результат.

Это что-то вроде того, что я хочу, но это не работает. 500. Я тоже не разбираюсь в отладке, поэтому, если возможно, поместите меня в правильном направлении, чтобы я мог предоставить дополнительную информацию.

// GET: api/Tests/robert 
    [ResponseType(typeof(Test))] 
    public async Task<IHttpActionResult> GetTest(string id) 
    { 
     //This is the default approach that just searches by primary key 
     //Test test = await db.Tests.FindAsync(id); 

     /*This is roughly what I want. Compiles, but doesn't work.*/ 

     var query = "SELECT* WHERE id=" + id; 
     Test test = db.Tests.SqlQuery(query, id); 
     if (test == null) 
     { 
      return NotFound(); 
     } 

     return Ok(test); 
    } 

Сообщите мне, где я прищурился. Я пробовал это часами. Я не претендую на то, чтобы быть особенно хорош в этом.

ответ

1

Попробуйте объявить свой метод, как этот

[RoutePrefix("api")] 
public class HisController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Test(string name) {...} 
} 

Кроме того, я рекомендовал бы Вам использовать рамки сущности

[RoutePrefix("api")] 
public class HisController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Test(string name) 
    { 
     using (MyEntities bm = new MyEntities()) 
     { 
      var usr = bm.Users.Where(u => u.Name == name).ToList(); 

      if (usr.Count() > 0) 
       return Request.CreateResponse(HttpStatusCode.OK, new 
       { 
        Success = true 
         , 
        Message = "Total users: " + usr.Count() 
         , 
        Data = usr 
       }); 

      return Request.CreateResponse(HttpStatusCode.NotFound, new { Success = false, Message = "No users found..." }); 
     } 
    } 
} 
+1

Я бы второй ФВ подход. Код из OP открыт для атаки SQL-инъекции. Вы никогда не должны доверять входам, и определенно не при отправке их в SQL-запрос. – heartlandcoder

+1

Он никогда не ударит этот метод с помощью www.mywebsite.com/api/tests/{username}, если он не изменит привязки по умолчанию. RouteConfig необходимо обновить, если он хочет использовать эту схему URL для доступа к этому методу. – RizJa

+0

То правда, я предположил, что он имел право конфигурации для своего класса '[RoutePrefix ("API")] класс HisController общественности: ApiController {[HttpGet] HttpResponseMessage тест общественности (имя строки) {...}}' – Rafa

Смежные вопросы