2012-05-16 3 views
0

У меня есть контроллер для всей моей базы данных, код ниже:Несколько IQueryable в одном контроллере?

public class YogaController : DbDataController<Yoga.Models.YOGAEntities> 
{ 
    public YogaController() 
    { 
    } 

    public IQueryable<Yoga.Models.Action> GetActions(int BugId) 
//GetActions retrieves "actions" table from the db, not Actions in MVC term 
    { 
     return DbContext.Actions.Where(x => x.FK_BugsID == BugId); 
    } 
    public IQueryable<Yoga.Models.Label> GetRequiredLabels() 
    { 
     return DbContext.Labels.Where(x => x.IsRequired == true); 
    } 
    public IQueryable<Yoga.Models.Role> GetRoles() 
    { 
     return DbContext.Roles; 
    } 
    public IQueryable<Role> GetRoles2() //TODO: finish this 
    { 
     return DbContext.Roles.Where(x => x.RoleID == 1); 
    } 
    public IQueryable<Tag> GetTags(int actionid) 
    { 
     return DbContext.Tags.Where(x => x.J_Tags.Any(y => y.FK_ActionID == actionid)); 
    } 
} 

Как вы можете видеть, у меня есть несколько IQueryable в одном контроллере, каждый запрос другой таблицы. Это что-то, что запрещено? Потому что, когда я иду в localhost/api/Yoga/GetActions или localhost/api/Yoga/GetRequiredLabels я получаю сообщение об ошибке:

Multiple actions were found that match the request: 
System.Linq.IQueryable`1[Yoga.Models.Label] GetRequiredLabels() on type Yoga.Controllers.YogaController 
System.Linq.IQueryable`1[Yoga.Models.Role] GetRoles() on type Yoga.Controllers.YogaController 
System.Linq.IQueryable`1[Yoga.Models.Role] GetRoles2() on type Yoga.Controllers.YogaController 

Когда я отключить все, кроме одного IQueryable, результаты вышли отлично.

У меня есть проблемы с аналогичными проблемами и проверены параметры маршрутизации, нет конфликтов в пути и именах контроллеров.

Мои маршруты (по умолчанию сгенерированные):

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
     //routes.MapRoute(
     // name: "Default", 
     // url: "{controller}/{action}/{id}", 
     // defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

Любые идеи?

+2

Почему вы возвращаете IQueryable как возвращаемый тип вашего метода действий? – Shyju

+1

Это учебник, который я видел с помощью MVC4: http://goo.gl/mqzDD Где интерфейс использует upshot.js, и он напрямую обрабатывает IQueryable. Я не слишком уверен в точном механизме – Bonk

+1

Возвращение IQueryable позволяет использовать фильтры и параметры OData в запросе этого действия – diaho

ответ

3

MVC4, вероятно, соответствует вашему HTTP-глаголу (Get) против всех методов с именами, начинающимися с «Get» и без параметров. Попробуйте принуждая имя действия:

[ActionName("GetRequiredLabels")] 
public IQueryable<Yoga.Models.Label> GetRequiredLabels() 
... 
[ActionName("GetActions")] 
public IQueryable<Yoga.Models.Action> GetActions(int BugId) 
... // etc 

EDIT:

на основе маршрутов, которые Вы вставили и контроллера, я думаю, что ваши маршруты должны быть:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 

т.е. он должен иметь {action} там. Маршрут MVC4 по умолчанию будет работать, если у вас только один метод «Get». Поскольку у вас несколько, вам нужно заставить его выбрать действие на основе маршрута.

+0

Просто попробовал, я получаю ту же ошибку. Я попытался включить параметры, 'localhost/api/Yoga/GetActions? BugId = 1', и он просто не смог найти действие:' Никакого действия не найдено на контроллере «Йога», который соответствует запросу. « – Bonk

+1

Это определенно не потому, что у вас есть несколько действий, возвращающих IQueryable, так как у меня есть контроллеры, которые делают то же самое. Не могли бы вы разместить свой маршрут? – diaho

+0

Спасибо! Я только что обновил, чтобы включить мои маршруты. – Bonk

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