2016-04-09 3 views
1
//This is student model 
namespace StudentApp.Models 
{ 
    public class Student 
    { 
     [Key] 
     public int studentId { get; set; } 
     public List<AssignedSupervisor> assigned_supervisorId { get; set; } 
    } 
    public class AssignedSupervisor 
    { 
     [Key] 
     public int supervisorId { get; set; } 
    } 
} 

на основе модели студента, структура организация создала ниже дбИспользование Linq для возврата нескольких значений с помощью DTO

//Here is the sample db structure 
//Table Students 
studentId 
--------- 
    1 
    2 
//Table Supervisors 
supervisorId | studentId 
------------ --------- 
    101   1 
    102   1 
    105   2 

studentId является внешним ключом в таблице супервизора. Студенты могут назначить одного или нескольких руководителей. Требуемая мощность должна быть похожа на примере ниже:

{ 
    "studentId": "1", 
    "supervisorId": [101,102] 
}, 
{ 
    "studentId": "2", 
    "supervisorId": [105] 
} 

Ниже DTO

//This is student DTO 
namespace StudentApp.DTOs 
{ 
    public class StudentDTO 
    { 
     public int studentId { get; set; } 
     public List<AssignedSupervisor> assigned_supervisorId { get; set; } 
    } 
} 

В мой контроллер

namespace ContractingApp.Controllers 
{ 
    //first way I'm doing which returns ugly JSON. 
    public List<StudentDTO> GetStudents() 
    { 
     return db.Students.Select(s => new StudentDTO() 
     { 
      studentId = s.studentId, 
      //Not sure how to use the select statement with it 
      assigned_supervisorId = s.Supervisors.Where(
       u => u.studentId == s.studentId 
       ).ToList() 
     }).ToList(); 
    } 

    //Another way I have tried after the suggestions by @darth_phoenixx I'm trying which doesn't return correct correct format either. 
    //It returns 3 JSON objects - one with each supervisor ID. 
    public List<dynamic> GetStudents() 
    { 
     var students = (from t1 in db.Students 
         join t2 in db.Supervisors on t1.studentId equals t2.studentId 
         select new 
         { 
          t1.studentId, 
          t2.supervisorId 
         }); 
     return students.ToList<dynamic>(); 
    } 
} 

Любая статья или направление, чтобы решить, будет полезна.

+0

У вас есть таблица, содержащая сведения о супервизорах? Если это так, я думаю, вы, вероятно, захотите заглянуть в соединение - присоединение таблицы студентов к таблице супервизоров и получение супервизора из базы данных также на основе 'supervisor_internal_id'. Взгляните на [http://stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql](http://stackoverflow.com/ вопросы/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql) –

+0

@darth_phoenixx - Спасибо за помощь и ссылку. Я попытался использовать Join, но он не возвращает JSON в ожидаемом формате. Я обновил свой вопрос на примере требуемого формата. Пожалуйста, смотрите. Я рад предоставить дополнительную информацию, если потребуется. Самая большая проблема, с которой я столкнулся, - найти правильные слова, чтобы объяснить это. :) – sandiejat

ответ

0

Я нашел подсказку о stackoverflow. Спасибо @Aducci за ответ на вопрос: Mapping Linq Query results to a DTO class

Вопрос был с моими DTO. Правильный DTO должно быть:

//SupervisorId is in another DTO and has the correct data type as it is in the DB. 
namespace StudentApp.DTOs 
{ 
    public class StudentDTO 
    { 
     public int studentId { get; set; } 
     public IEnumerable<SupervisorDTO> assigned_supervisorId { get; set; } 
     //assigned_supervisorId in Student Model needs to be IEnumerable to work with this change in DTO. 
    } 
    //Separate DTO for supervisor 
    public class SupervisorDTO 
    { 
     public int supervisorId { get; set; } 
    } 
} 

После DTO был отсортирован, то StackOverflow ответ помог в получении «цепочки» из запросов, сделанных. Для каждого запроса необходимо использовать соответствующий DTO. И вот последний контроллер в моем WebAPI. (db является объектом Структуры Entity)

public IEnumerable<StudentDTO> GetStudents() 
{ 
    return (from t1 in db.Students 
      select new StudentDTO() 
      { 
       studentId = t1.StudentId, 
       assigned_supervisorId = (from t2 in db.Supervisors 
           where t1.StudentId == t2.StudentId 
           select new SupervisorDTO() // Supervisor DTO needs to be used here 
           { 
            supervisorId = t2.supervisorId 
           }) 
      }); 
} 
Смежные вопросы