【问题标题】:Update one DataTable from another从另一个更新一个 DataTable
【发布时间】:2011-01-27 09:32:45
【问题描述】:
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');
更新
SET e.dept_name = d.dept_name
来自员工 AS e
       加入部门作为 d
       ON e.dept_id = d.dept_id

如何将上述查询(粗体字)转换为 LINQ 查询?

【问题讨论】:

    标签: linq datatable


    【解决方案1】:

    我不确定你能做到。 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();
    

    但是
    您可能已经知道这一点,但是规范化您的数据库可能会更好,以便部门名称​​only 在部门表上,并使用您的员工->部门关系来获取部门名称给定员工。

    【讨论】:

      【解决方案2】:

      使用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();
      

      【讨论】:

        【解决方案3】:

        其中一种解决方法如下:

        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"));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-15
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 2016-12-12
          • 2011-06-21
          相关资源
          最近更新 更多