Основная проблема является вашим 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();
}
}
Что касается имен переменных, имейте в виду, что Web API связывает переменную id из словаря маршрута, поэтому имя должно соответствовать шаблону маршрута. –
Это отлично работает! Скажем, если я хочу только несколько полей в нем. Как я могу его изменить? Мой измененный запрос LINQ - var queryResult = context.SubjectContext . Где (x => x.CreatedBy == CreatedBy) .Выберите (x => новый объект {x.Id, x.Name}); – user2412230
@ user2412230 ты на правильном пути. Ваш код должен работать, поскольку вы используете анонимный тип. Вы также можете определить класс, который имеет только нужные вам поля, и создать экземпляр этого класса в вызове .Select(). Это облегчает переход к другим методам и т. Д., Если это необходимо. –