Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何选择LINQ数据表联接中的所有列?_C#_Linq - Fatal编程技术网

C# 如何选择LINQ数据表联接中的所有列?

C# 如何选择LINQ数据表联接中的所有列?,c#,linq,C#,Linq,我想在SQL Server内部联接查询中选择两个表状联接的所有列 另外 如何将两个表的整个结果转换为数据表 var collection = from t1 in dt1.AsEnumerable() join t2 in dt2.AsEnumerable() on t1["id"] equals t2["id"] select new { Name = t1["name"], Group =

我想在SQL Server内部联接查询中选择两个表状联接的所有列

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

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"] };
然后

编辑:

类似的东西

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

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

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

//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);
}
如果您需要将其展平,那么您必须自己编写映射,但这仍然是非常琐碎的

引用自:

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

select new { CTLJCRJOB, CTLRFDSTM }
您可以像myObj.Object1.Property1、myObj.Object2.Property4这样使用它

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

select new 
{
    Object1 = object1,
    Object2 = output
};
引用自


希望这将有帮助

您可以在
选择新{…}
中列出两个表中所需的所有属性,这样我就可以逐个访问行了:(我想将结果转换为数据表。如何将两个表的整个结果转换为数据表?代码段完成。我强烈建议您使用自动化程度较低的版本(从内部联接手动命名每个列)。正如我在回答中提到的,如果dt1和dt2具有同名的列,它将只获取其中一个(dt1)的值而不是另一个。你不应该发布仅链接的答案,因为如果粘贴在此处的URL已失效,则该答案将无效。请参考。感谢指出我的错误,我从不知道存在此类协议。即使@DesertFox已经给出了答案,我仍将编辑我的答案。我的表包含62列。如何逐个指定类似于此的列?名称、组等不过,最好使用和SP或基本查询检索数据,然后将它们作为对象进行操作
select new CombinedType(object1, output);
//or 
select builder.GetCombinedType(object1, output);
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() ;