C# — возврат приведения контекста базы данных

В настоящее время я использую контекст базы данных Asp.net для создания API, и у меня возникла проблема. У меня есть две таблицы базы данных, и я хочу вывести некоторые данные, но не все

Мои столы:

Employee Table:
+----+------+---------------+------------+---------------+
| Id | Name |     Mail      |   Phone    |   Birthday    |
+----+------+---------------+------------+---------------+
|  1 | John | [email protected] | 987 72 123 | 25-July  2000 |
|  2 | Stan | [email protected] | 978 21 342 | 10-April 1998 |
|  3 | Kim  | [email protected]  | 973 28 199 | 26-March 2001 |
+----+------+---------------+------------+---------------+

Shift Table:
+------------+--------------------+--------------------+--------+
| EmployeeId |       Start        |        End         | Active |
+------------+--------------------+--------------------+--------+
|     1      | 10-June 2019 08:00 | 10-June 2019 16:00 |  true  |
|     2      | 10-June 2019 12:00 | 10-June 2019 18:00 |  true  |
|     3      | 10-June 2019 16:00 | 11-June 2019 00:00 |  true  |
|     2      | 11-June 2019 08:00 | 11-June 2019 16:00 |  true  |
+------------+--------------------+--------------------+--------+

В моих таблицах таблица сотрудников и таблица смен имеют связь 1-Many между Employee.Id и Shift.Id

Используя созданный мной контроллер, я смог вернуть все данные, однако я хочу вернуть определенный набор данных (не все), в основном я хочу вернуть только< /сильный>:


+----+------+--------------------+--------------------+--------+
| Id | Name |       Start        |        End         | Active |
+----+------+--------------------+--------------------+--------+
|  1 | John | 10-June 2019 08:00 | 10-June 2019 16:00 | true   |
|  2 | Stan | 10-June 2019 12:00 | 10-June 2019 18:00 | true   |
|  3 | Kim  | 10-June 2019 16:00 | 11-June 2019 00:00 | true   |
|  2 | Stan | 11-June 2019 08:00 | 11-June 2019 16:00 | true   |
+----+------+--------------------+--------------------+--------+


Я пробовал следующий код в контроллере, но я не могу вернуть набор данных, который я хочу

private readonly DatabaseContext context;

public ManageUsersController(DatabaseContext Dbcontext)
{
    context = Dbcontext;
}

[HttpGet("Users")]
public List<Employee> GetUsers()
{
    var data = context.Employee.Include(c=> c.Schedule).toList();
    return data;
}

Модели, которые я получаю, выглядят так

public partial class Employee
    {
        public int Id { get; set; }
        public int PhoneNr { get; set; }
        public string Name { get; set; }
        public string Mail { get; set; }
        public DateTime Birthday { get; set; }
        public bool Active { get; set; }

        //Relationship
        public ICollection<Schedule> Schedule { get; set; }
    }

    public partial class Schedule
    {
        public int Id { get; set; } //EmployeeId
        public DateTime Start { get; set; }
        public DateTime End{ get; set; }
        public bool? Active { get; set; }

        //Relationship
        public Employee Employee { get; set; }
    }

наконец, мой файл DatabaseContext выглядит так:

public class DatabaseContext: DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
    {
    }

    public DbSet<Schedule> Schedule { get; set; }
    public DbSet<Employee> Employee { get; set; }

}

Надеюсь, мой вопрос не будет длинным, и заранее спасибо за ответ


person Steinar    schedule 13.06.2019    source источник
comment
Итак, вы говорите, что хотите отфильтровать данные таблицы сдвига? Если да, какой фильтр вы хотите добавить... дату, имя или?   -  person dim mik    schedule 13.06.2019
comment
Какие данные вам нужно отфильтровать, основаны ли они на любом условии. вы можете использовать, где после включения функции.   -  person Usama Kiyani    schedule 13.06.2019
comment
Я хочу объединить таблицы в одну таблицу, так же, как вы бы сделали в SQL со следующим кодом: Выберите e.ID, e.Name, s.Start, s.End, s.Active внутреннее расписание соединения s на s. Id = e.Id от сотрудника e   -  person Steinar    schedule 13.06.2019
comment
@Steinar посмотрите здесь stackoverflow.com/questions/24485360/   -  person dim mik    schedule 13.06.2019
comment
@dimmik Спасибо! Искали что-то подобное уже как минимум 2 дня!!   -  person Steinar    schedule 13.06.2019


Ответы (2)


Создайте еще один класс, который будет содержать только необходимые свойства.

public class EmployeeWithScheduleModel
{
    public int Id {get;set;}
    public string Name {get;set;}
    public DateTime Start {get;set;}
    public DateTime End {get;set;}
    public bool? Active {get;set;}
}

Затем измените метод вашего контроллера, чтобы возвращать только то, что необходимо:

public List<EmployeeWithScheduleModel> GetUsers()
{
    var data = context.Employee.Include(c=>c.Schedule).ToList();

    var response = new List<EmployeeWithScheduleModel>();

    foreach (var item in data)
    {
        if(!item.Schedule.Any() || item.Schedule.Count > 1) continue; //your custom logic here

       var schedule = item.Schedule.FirstOrDefault();


       var employeeWithSchedule = new EmployeeWithScheduleModel
       {
          Id = item.Id,
          Name = item.Name,
          Start = schedule.Start,
          End = schedule.End,
          Active = schedule.Active
       };

       response.Add(employeeWithSchedule);
    }     

    return response;
}
person Florin-Constantin Ciubotariu    schedule 13.06.2019

как ответил @dimmik в комментариях к вопросу, можно вернуть данные с помощью Linq. В моем случае это будет:

[HttpGet("")]
public List<EmployeeTable> GetUsers()
{
    var d = from e in context.Employee
        join s in context.Schedule on e.Id equals s.EmployeeId
        select new
        {
            Id = e.Id,
            Name = e.Name,
            Phone = e.PhoneNr,
            Mail = e.Mail,
            State = e.Active
        };
    return (List<EmployeeTable>)(Object)d.ToList();
}

EmployeeTable — это созданный мной пользовательский класс, который имеет идентификатор, имя, телефон, почту и состояние в качестве свойства.

person Steinar    schedule 13.06.2019