如何选择LINQ Datatable join中的所有列?

时间:2017-04-20 04:50:17

标签: c# linq

var collection = from t1 in dt1.AsEnumerable()
                 join t2 in dt2.AsEnumerable()
                 on t1["id"] equals t2["id"]
                 select new { Name = t1["name"], Group = t2["group"] };

我想选择两个表的所有列,例如SQL Server内连接查询中的连接。

另外 如何将两个表的整个结果转换为数据表?

3 个答案:

答案 0 :(得分:4)

var collection = from t1 in dt1.AsEnumerable()
             join t2 in dt2.AsEnumerable()
             on t1["id"] equals t2["id"]
             select new { T1 = t1, T2 = t2 };

...然后

修改

沿着这些方向的东西

//clone dt1, copies all the columns to newTable 
DataTable newTable = dt1.Clone();

//copies all the columns from dt2 to newTable 
foreach(var c in dt2.Columns)
    newTable.Columns.Add(c);

//now newTable has all the columns from the original tables combined

//iterates over collection
foreach (var item in collection) {
    //creates newRow from newTable
    DataRow newRow = newTable.NewRow();
    //iterate the columns, gets values from either original table if column name is there
    foreach(var c in newTable.Columns)
        newRow[c.ColumnName] = item.T1.ContainsColumn(c.ColumnName) ?  item.T1[c.ColumnName] : item.T2[c.ColumnName];
    newTable.Rows.Add(newRow);
}

这会奏效。但是如果dt1和dt2共享多个具有完全相同名称的列,则可能会丢失一些数据。

答案 1 :(得分:1)

虽然您无法将它们扩展为列,但您只需返回实体即可。例如:

select new { CTLJCRJOB, CTLRFDSTM }

如果你需要弄平,那么你必须自己写出映射,但仍然是非常微不足道的。

参考:

Select All columns for all tables in join + linq join

如果要投影到展平类型,则必须手动指定每个。您的另一个选择是让您的组合类型包含两个对象,并且对象自然会带来它们的属性。

select new 
{
    Object1 = object1,
    Object2 = output
};

你会像myObj.Object1.Property1,myObj.Object2.Property4等一样使用它。

仍然涉及一些手动工作的最后一个选项是定义一个合适的类型,并使用构造函数或构建器方法来完成将对象属性分割为展平类型的工作。您仍然执行手动映射,但将其与查询逻辑隔离开来。

select new CombinedType(object1, output);
//or 
select builder.GetCombinedType(object1, output);

引自

Select all columns after JOIN in LINQ

答案 2 :(得分:0)

var collection = (from t1 in dt1.AsEnumerable()
                 join t2 in dt2.AsEnumerable()
                 on t1  ["id"] equals t2  ["id"]
                 select new { Name = t1  ["name"], Group = t2  ["group"] }).ToList() ;

希望这会有所帮助