Обновите один DataTable от другого - PullRequest
1 голос
/ 27 января 2011
create table employee
(
    id int,
    name varchar(10),
    dept_id int,
    dept_name varchar(10)
);

insert into employee values(1, 'ABC1', 1, '');
insert into employee values(2, 'ABC2', 2, '');
insert into employee values(3, 'ABC3', 1, '');
insert into employee values(4, 'ABC4', 2, '');
insert into employee values(5, 'ABC5', 1, '');

create table dept
(
    dept_id int,
    dept_name varchar(10)
);

insert into dept values(1, 'XYZ1');
insert into dept values(2, 'XYZ2');
<b>UPDATE e
SET    e.dept_name = d.dept_name
FROM   employee AS e
       JOIN dept AS d
       ON e.dept_id = d.dept_id</b>

Как преобразовать указанный выше запрос (жирным шрифтом) в запрос LINQ?

Ответы [ 3 ]

0 голосов
/ 27 января 2011

с использованием join:

var employeeDept = from e in db.employees 
                  Join d in db.Depts on e.dept_id equals d.dept_id 
                  select new 
                  {Employee = e ,
                   Department = d};

foreach(var ed in employeeDept)
{
   ed.Employee.DepartmentName = ed.Department.DepartmentName;
}
db.submitChanges();
0 голосов
/ 27 января 2011

Одно из решений выглядит следующим образом:

var enumEmp = employee.AsEnumerable(); 
var enumDept = dept.AsEnumerable();

var employeeDept = from empl in enumEmp 
join d in enumDept on empl.Field<int>("dept_id") equals d.Field<int>("dept_id")
select new {enumEmp = empl , enumDept = d};

foreach(var ed in employeeDept)
{
ed.enumEmp.SetField<string>("dept_name",ed.enumDept.Field<string>("dept_name"));
}
0 голосов
/ 27 января 2011

Я не уверен, что ты можешь.Linq to SQL предназначен для получения и извлечения данных из вашей базы данных для использования в коде вашего приложения.Здесь вам нужна низкоуровневая манипуляция данными, которая лучше всего выполняется в T-SQL, как показывает ваш пример.

Вы можете загрузить записи из обеих таблиц, используя соединение в другой объект, а затем выполнить итерациюрезультаты.

// I'm doing this this way because I can't remember the syntax for 
// LoadOptions and want to be sure to avoid the SELECT N+1 issue.
var query = from e in db.Employees
            select new EmployeeDepartment
                       {
                           Employee = e,
                           Department = e.Department
                       };

foreach (var item in query)
{
    item.Employee.DepartmentName = item.Department.DepartmentName;
}

db.SubmitChanges();

Однако
Вы, вероятно, уже знаете это, но, возможно, было бы лучше нормализовать вашу базу данных, чтобы название отдела было только в таблице отделов и используйте ваши отношения сотрудник-> отдел, чтобы получить название отдела для данного сотрудника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...