Linq to Sql, получение вложенных структур данных одним запросом - PullRequest
2 голосов
/ 19 марта 2009

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

Допустим, у меня есть 2 таблицы:

------------Employees-------------
EmployeeID  Name  -other columns-

   ---------EmployeeSkills-----------
   EmployeeID  Skill  -other columns-

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

Моя цель - нарисовать эту информацию в структуре данных в памяти, , используя один SQL-запрос

    class StaticEmployee
    {
        int EmployeeID;       
        string Name;
        List<string> Skills;
    }
    List<StaticEmployee> employees = (???).ToList();

Поскольку мои отношения с таблицами настроены, я могу просто обратиться к таблице сотрудников ( от сотрудника в db.Employees select employee ), однако, когда я получу доступ к свойству EmployeeSkills, он выполнит отдельный запрос для каждой записи сотрудника, поскольку эти данные не были возвращены при первом запросе.

В качестве альтернативы, и я хочу сделать то, что касается Sql, - выполнить запрос с левым соединением:

SELECT Employees.EmployeeID, Employees.Name, EmployeeSkills.Skill FROM Employees LEFT JOIN EmployeeSkills ON Employees.EmployeeID=EmployeeSkills.EmployeeID

Это даст мне мой список, но мне нужно будет вручную сопоставить его с моим списком, поскольку сотрудник с двумя навыками вернет 2 строки. Есть ли операция Linq, которая делает это? Гипотетический пример ниже

from employee in db.Employees
select new 
{
   EmployeeID = employee.EmployeeID, 
   Name = employee.Name,
   Skills = new List(
                     from employeeSkill in employee.EmployeeSkills 
                     select employeeSkill.skill
                    )
}

1 Ответ

4 голосов
/ 19 марта 2009
var options = new DataLoadOptions();
options.LoadWith< Employees>(e => e.EmployeeSkills);
context.LoadOptions = options;
//retrieve employees, they will come loaded with EmployeeSkills

Если вместо этого вы используете версию запроса linq, это также загрузит их один раз:

from employee in db.Employees
select new 
{
   EmployeeID = employee.EmployeeID, 
   Name = employee.Name,
   Skills = employee.EmployeeSkills
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...