2014-01-11 2 views
2

Im new для .Net Web API.Asp.Net web api - Как получить все записи

Я хочу получить все записи, где CreatedBy = 1 (это не первичный ключ).

Моя модель

public class Subject 
{ 
    [Key] 
    public int Id { get; set; } 
    public int UniId { get; set; } 
    public bool IsActive { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public int CreatedBy { get; set; } 
    public int UpdatedBy { get; set; } 
} 

Мой метод прибудет в контроллере

public Subject Get(int id) 
    { 
     IQueryable<Subject> query; 
     return query = from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id).ToList(); 
    } 

ответ

5

Основная проблема является вашим Get метода в Controller настроено вернуть один Subject объект, а не List<Subject>. Ваш запрос выглядит правильно.

Основное изменение должно быть следующим

public List<Subject> Get(int id) 
{ 
    IQueryable<Subject> query; 
    return query = from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id).ToList(); 
} 

На стороне записки, имя переменной id неоднозначно. Используя что-то вроде createdById, на первый взгляд указывает случайному наблюдателю переменная id представляет пользователя, который создал много Subjects, а не идентификатор Subject.

И, я бы сказал то же самое для имени метода Get ... Что? Get также слишком близок к ключевому слову C# get, используемому в объявлениях свойств. Это должно быть более наглядным. Всего несколько быстрых заметок, которые не влияют на вашу проблему :)

Наконец, я обращу внимание на то, как вы возвращаетесь из функции, является неортодоксальным, хотя технически правильным и будет скомпилироваться. Вы можете пропустить назначение переменной в обратном заявлении или даже пропустить, используя переменную вообще и просто вернуть List<Subject> .. Я также добавил, используя заявление для DataContext, который является лучшей практикой:

public List<Subject> Get(int id) 
{ 
    using(var context = new YourDataContext()) 
    { 
     var queryResult = (from Subjects in db.SubjectContext.Where(v => v.CreatedBy == id)).ToList(); 
     return queryResult; 
    } 
} 

Или без заявления LINQ ,

public List<Subject> Get(int id) 
{ 
    using(var context = new YourDataContext()) 
    { 
     return context.Subjects.Where(v => v.CreatedBy == id)).ToList(); 
    } 
} 
+0

Что касается имен переменных, имейте в виду, что Web API связывает переменную id из словаря маршрута, поэтому имя должно соответствовать шаблону маршрута. –

+0

Это отлично работает! Скажем, если я хочу только несколько полей в нем. Как я могу его изменить? Мой измененный запрос LINQ - var queryResult = context.SubjectContext . Где (x => x.CreatedBy == CreatedBy) .Выберите (x => новый объект {x.Id, x.Name}); – user2412230

+0

@ user2412230 ты на правильном пути. Ваш код должен работать, поскольку вы используете анонимный тип. Вы также можете определить класс, который имеет только нужные вам поля, и создать экземпляр этого класса в вызове .Select(). Это облегчает переход к другим методам и т. Д., Если это необходимо. –

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