如何在LINQ DataTable联接中选择所有列?

3
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内部连接查询中一样。

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


你可以在 select new {...} 中列出你需要从两个表中获取的所有属性。 - TriV
3个回答

5
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共享多个具有完全相同名称的列,则可能会丢失一些数据。

这是我逐行访问的方式。:( 我想将结果转换为数据表。如何将两个表的整个结果都转换为数据表? - Himanshu Suthar
代码片段已完成。我强烈建议您使用更少自动化的版本(手动为内部连接中的每个列命名)。正如我在答案中提到的,如果dt1和dt2具有相同名称的列,则只会获取其中一个(dt1)的值,而不是另一个。 - DesertFox

1
虽然你不能将它们扩展到列,但可以简单地返回实体。例如:
select new { CTLJCRJOB, CTLRFDSTM }

如果您需要将它展平,则必须自己编写映射,但这仍然非常简单。
引用自: 选择联接中所有表的所有列 + linq联接 如果要投射到扁平化类型中,则必须手动指定每个属性。另一种选项是让组合类型包含两个对象,并且这些对象会自然地带上它们的属性。
select new 
{
    Object1 = object1,
    Object2 = output
};

你可以像这样使用它:myObj.Object1.Property1,myObj.Object2.Property4等。

最后一个选项仍然需要一些手动工作,即定义一个适当的类型并具有构造函数或构建器方法,将对象属性分段到扁平化类型中。你仍然需要手动映射,但是将其与查询逻辑隔离开来。

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

参考来源

在LINQ中选择JOIN后的所有列


你不应该只发布一个链接作为答案,因为如果此处粘贴的URL失效,它将无效。请参考这里 - PM.
谢谢您指出我的错误,我从未知道这样的协议存在。尽管@DesertFox已经给出了答案,但我会编辑我的回答。 - andrew subash

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

希望这能有所帮助


我的表格包含62列。我该如何逐个指定这些列,例如名称、组等等? - Himanshu Suthar
如果您可以使用存储过程或基本查询检索数据,然后将其作为对象进行操作,那将更好。我认为在linq查询中获取所有的62个列不是一个好主意。 - Chad C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接