C# Получение коллекций с вложенными коллекциями из базы MSSQL

356
16 февраля 2018, 16:22

Здравствуйте! Вопрос такой - в своём приложении использую, например, класс подразделения (Department), у которого есть вложенная коллекция сотрудников (Employee).

Задача - получить коллекцию всех подразделений с сотрудниками.

Подразделений много, сотрудников очень много, и в итоге эта конструкция работает довольно долго...

Упрощенно выглядит так:

public class Department
{
    public string ID {get;set;}
    public string Name {get;set;}
    public ObservableCollection<Employee> Employees {get;set;}
    public static ObservableCollection<Department> GetAll()
    {
         DataTable dt = new DataTable();
         ObservableCollection<Department> Deps = new ObservableCollection<Department>();
         using (SqlConnection conn = DBHelper.CreateConnection())
         {
            SqlCommand cmd = new SqlCommand("[Departments_GetAll]", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            conn.Open();
            da.Fill(dt);
         }
         foreach (DataRow row in dt.Rows)
         {
            Department dep = new Department{
                 ID = row["ID"].ToString(),
                 Name = row["Name"].ToString(),
                 Employees = Employee.GetByDepartmentID(row["ID"].ToString())
            };
            Deps.Add(dep);
         }
         return Departments;
    }
}
public class Employee
{
    public string ID {get;set;}
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public static ObservableCollection<Employee> GetByDepartmentID (string departmentID)
    {
         DataTable dt = new DataTable();
         ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();
         using (SqlConnection conn = DBHelper.CreateConnection())
         {
            SqlCommand cmd = new SqlCommand("[Employees_GetByDepartmentID]", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@DepID", new Guid(departmentID)));
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            conn.Open();
            da.Fill(dt);
         }
         foreach (DataRow row in dt.Rows)
         {
              Employee emp = new Employee
              {
                   ID = row["ID"].ToString(),
                   FirstName = row["FirstName"].ToString(),
                   LastName = row["LastName"].ToString()
              };
              Employees.Add(emp);
         }
         return Employees;
    }
}

Это один из примеров, схема очень упрощенная. Свойств, естественно, больше. Вложенные коллекции могут уходить и на пять уровней вглубь. Работает это всё очень неповоротливо (сами sql запросы очень быстро, медленно именно на уровне объектной модели). Подтащить все коллекции заранее и работать по ним через linq - не вариант, т.к. их много, и в базе всё динамически меняется, локальные данные будут сразу устаревать (или их надо как-то не затратно обновлять, не не знаю как).

Являюсь самоучкой, чую что делаю что-то в корне неправильно... Подскажите, как работать с получением вложенных коллекций чтобы не было мучительно больно...

Заранее большое спасибо за советы.

READ ALSO
Monodevelop.ошибка создания целевого объекта

Monodevelop.ошибка создания целевого объекта

Переношу проект с# window в monodevelopНо выходит ошибка при компиляции ошибка создания целевого объекта LinkEmbeddableAssemblies:

233
Вызвать предупреждение в C#

Вызвать предупреждение в C#

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

224
Ошибка при использовании указателей в c#

Ошибка при использовании указателей в c#

Переписываю код с Си на C#Столкнулся со следующей проблемой

180
Как Отслеживать запросы ReacJS

Как Отслеживать запросы ReacJS

Прошу помощи найти инструмент для лова запросов ReacJS Уже замучился весь инет обрыскал не нашел ответа, как отследить запросы ReactJS

321