2017-04-20 28 views
1
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内部连接查询中选择所有列都像join。如何选择LINQ Datatable连接中的所有列?

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

+0

你可以列出你从2个表需要的所有属性'选择新{。 ..}' – TriV

回答

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

+0

这我怎么能够逐一访问行。 :(我想将结果转换为数据表,我怎样才能将两个表的整个结果转换为数据表? –

+0

Snippet done。我强烈建议你使用自动化程度较低的版本(手动命名内连接中的每一列)。正如我在答案中所提到的,如果dt1和dt2具有相同名称的列,它将只获得其中一个(dt1)的值,而不是另一个。 – DesertFox

1

尽管无法将它们展开为列,但您可以简单地返回实体。例如:

select new { CTLJCRJOB, CTLRFDSTM } 

如果你需要将它扁平化,那么你将不得不亲自写出映射,但仍然是非常微不足道的。

从引用:

Select All columns for all tables in join + linq join

OU,如果您要投影成扁平型手动指定每个。你的另一种选择是让你的组合类型包含两个对象,并且这些对象自然会带来它们的属性。

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

+0

您绝不应发布仅链接答案,因为它会如果此处粘贴的网址已无效,则无效。请参阅[this](https://meta.stackexchange。com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) –

+0

感谢您指出我的错误,我从来不知道这样的协议存在。即使@DesertFox已经给出了答案,我仍会编辑我的答案。 –

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

希望这将有助于

+0

我的表格包含62列。我怎样才能一个一个地指定这样的列?名称,组etctetc –

+0

如果您可以更好地使用SP或基本查询检索数据,然后将它们作为对象进行操作。我不认为这是一个好主意,以获得linq查询中的所有62列 –

相关问题