2013-12-06 2 views
0

С текущим методом я не могу получить правильные результаты из следующей строки запроса: /API/данные имени = STORM% 202006-1% 20A2 & price_type = CVRКак построить метод [fromuri]?

[HttpGet] 
    public IEnumerable<database_WICs> Get([FromUri] Query query) 
    { 


     var data = from c in db.database_WICs 
        where c.Name == query.name || 
        c.CUSIP == query.cusip || 
        c.ISINs == query.isin || 
        c.Cover == query.price_type 
        select c; 
     return data.ToList(); 
    } 

Есть ли лучший способ для реализации этого фильтра с использованием запроса linq. Если это так, любые примеры будут очень оценены.

ответ

0

Я полагаю, у вас есть модель под названием Query и API контроллера под названием Data, как показано ниже:

public class Query 
{ 
    public string name { get; set; } 
    public string cusip { get; set; } 
    public string isin { get; set; } 
    public string price_type { get; set; } 
} 

public class DataController : ApiController 
{ 
    //GET api/Data 
    public IEnumerable<database_WICs> Get([FromUri] Query query) 
    { 
     var data = from c in db.database_WICs 
        where c.Name == query.name || 
        c.CUSIP == query.cusip || 
        c.ISINs == query.isin || 
        c.Cover == query.price_type 
        select c; 
     return data; 
    } 
} 

Ваш метод API GET это хорошо, просто удалить "ToList()". Если вы хотите, чтобы вернуть HttpResponseMessage, вы можете изменить его, как показано ниже:

//GET api/Data 
    public HttpResponseMessage Get([FromUri] Query query) 
    { 
     var data = from c in db.database_WICs 
          where c.Name == query.name || 
          c.CUSIP == query.cusip || 
          c.ISINs == query.isin || 
          c.Cover == query.price_type 
          select c; 
     if (!data.Any()) 
     { 
      var message = string.Format("No database_WICs was found"); 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, message); 
     } 
     return Request.CreateResponse(HttpStatusCode.OK, data); 
    } 

Но проблема в том, ваш URI является неправильным. URI должен быть, как показано ниже:

/api/Data/?name=STORM&cusip=20&isin=2006-1%20A2&price_type=cvr 

Если вы передаете объект JSON к Web API через вызов AJAX, вызов AJAX должен быть, как показано ниже:

var data = {name:"STORM",cusip:"20",isin:"2006-1 20A2",price_type:"cvr"} ; 
$.ajax({ 
    url: "/api/Data/", 
    type: 'GET', 
    contentType: 'application/json', 
    data: JSON.stringify(data)   
    }); 
+0

Благодарим вас за подробный ответ и объяснение. Апология, чтобы казаться неблагодарной, я хотел бы иметь возможность вызывать строку запроса как «api/data/name? = Storm & price_type = talk». Если это возможно, это может быть достигнуто путем выполнения этого метода в условии Linq IF. – user3070072

+0

Привет, если я прав, вы хотите вызвать строку запроса с помощью LINQ. LINQ - это языковой интегрированный запрос, а не как AJAX, вы можете передать строку запроса, это вызовет функции на стороне сервера. – Lin

+0

Привет, Лин, я использовал вас в качестве основы для решения моей проблемы с строкой запроса. Приносим извинения, если я не был ясен в объяснении своей проблемы, но ваше решение очень помогло. – user3070072

0

мне удается придумать решение для поиска параметров, таких как имя и тип цены, вместе с использованием решения Lin выше:

 public HttpResponseMessage Get([FromUri] Query query) 
     { 
     var data = db.database_Dwic.AsQueryable(); 

     if (query.name != null) 
     { 
      data = data.Where(c => c.Name.Trim() == query.name);  
     } 

     if (query.price_type != null) 
     { 
      data = data.Where(c => c.Cover == query.price_type); 
     } 

     if (!data.Any()) 
     { 
      var message = string.Format("No data was found"); 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, message); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK, data); 
     } 
Смежные вопросы