C# 如何在使用linq将两个datatable的列进行内部连接后获取它们

C# 如何在使用linq将两个datatable的列进行内部连接后获取它们,c#,linq,datatable,C#,Linq,Datatable,我的linq如下所示 from dt1 in dsResults.Tables[0].AsEnumerable() join dt2 in dsResults.Tables[1].AsEnumerable() on dt1 .Field<decimal>("RecordId") equals dt2.Field<decimal>("RecordId2") select dt1 ; 来自dsResults.Tables[0]中的dt1的 在dsResults.Tab

我的linq如下所示

from dt1 in dsResults.Tables[0].AsEnumerable()
join dt2 in dsResults.Tables[1].AsEnumerable()
 on dt1 .Field<decimal>("RecordId") equals dt2.Field<decimal>("RecordId2")
 select dt1 ; 
来自dsResults.Tables[0]中的dt1的

在dsResults.Tables[1].AsEnumerable()中联接dt2
在dt1上,字段(“RecordId”)等于dt2.字段(“RecordId”)
选择dt1;

这将仅检索dt1的列。如何使两个表的列都显示?

您可以创建一个对象来表示要显示的列,然后可以执行以下操作:

public class YourObject
{
 public string Pror1 {get;set;}
 public string Pror2 {get;set;}
}



List<YourObject> result=from row1 in dsResults.Tables[0].AsEnumerable()
    join row2 in dsResults.Tables[1].AsEnumerable()
     on row1.Field<decimal>("RecordId") equals row2.Field<decimal>("RecordId2")
     select new YourObject()
     {
       Pror1=row1.prop1,
       Prop2=row2.prop2,
       ......
     }.ToList(); 
public类对象
{
公共字符串Pror1{get;set;}
公共字符串Pror2{get;set;}
}
List result=来自dsResults.Tables[0]中的第1行。AsEnumerable()
将dsResults.Tables[1]中的行2联接到AsEnumerable()中
第1行的字段(“RecordId”)等于第2行的字段(“RecordId”)
选择新对象()
{
Pror1=行1.prop1,
Prop2=行2.Prop2,
......
}.ToList();
如果要选择所有列,可以执行以下操作

 from row1 in dsResults.Tables[0].AsEnumerable()
        join row2 in dsResults.Tables[1].AsEnumerable()
         on row1.Field<decimal>("RecordId") equals row2.Field<decimal>("RecordId2")
         select new { RowTable1 = row1, RowTable2 = row2}; //anonymous type
来自dsResults.Tables[0]中的第1行的

将dsResults.Tables[1]中的行2联接到AsEnumerable()中
第1行的字段(“RecordId”)等于第2行的字段(“RecordId”)
选择新建{RowTable1=row1,RowTable2=row2}//匿名类型

在这种情况下,结果的每个元素将有两个属性:
RowTable1
将是
row1
中的一行,
RowTable2
将是
row2
1中的匹配行。您可以使用
匿名类型调整
选择子句
,并使用
字段属性包含所需的列

from dt1 in dsResults.Tables[0].AsEnumerable()
join dt2 in dsResults.Tables[1].AsEnumerable()
on dt1 .Field<decimal>("RecordId") equals dt2.Field<decimal>("RecordId2")
 select new
 {
   Property1 = dt1 .Field<decimal>("RecordId"),
   Property2 = dt2 .Field<decimal>("RecordId2")
   ...... 

  }
;
来自dsResults.Tables[0]中的dt1的

在dsResults.Tables[1].AsEnumerable()中联接dt2
在dt1上,字段(“RecordId”)等于dt2.字段(“RecordId”)
选择新的
{
Property1=dt1.字段(“记录ID”),
Property2=dt2.字段(“RecordId2”)
...... 
}
;
2如果不想指定列名

from dt1 in dsResults.Tables[0].AsEnumerable()
join dt2 in dsResults.Tables[1].AsEnumerable()
on dt1 .Field<decimal>("RecordId") equals dt2.Field<decimal>("RecordId2")
 select new
 {
   dt1,
   dt2 
  }
;
来自dsResults.Tables[0]中的dt1的

在dsResults.Tables[1].AsEnumerable()中联接dt2
在dt1上,字段(“RecordId”)等于dt2.字段(“RecordId”)
选择新的
{
dt1,
dt2
}
;
3如果要在序列之间设置并集


链接:

我可以按照下面的思路来做

DataTable targetTable=dsResults.Tables[0].Clone();
var dt2Columns=dsResults.Tables[1]。Columns.OfType()。选择(dc=>
新的DataColumn(dc.ColumnName、dc.DataType、dc.Expression、dc.ColumnMapping));
targetTable.Columns.AddRange(dt2Columns.ToArray());
变量行数据=
来自dsResults.Tables[0]中的第1行。可计算()
将dsResults.Tables[1]中的行2联接到AsEnumerable()中
第1行的字段(“RecordId”)等于第2行的字段(“RecordId”)
选择row1.ItemArray.Concat(row2.ItemArray.ToArray();
foreach(rowData中的对象[]值)
targetTable.Rows.Add(值);
公共字符串ShowNew(字符串myName)
{
RENTALEntities objD=新的RENTALEntities();
var NewObj=
(来自t in objD.TENANTs.ToList()
在objD.PROP_TYPE.ToList()中加入pt
关于t.Prop_ID等于pt.Prop_ID
其中t.姓氏==我的名字
选择新的{t.姓氏,t.宣传,pt.DESCRIPTION,t.RentalIncome});
返回“SWurname”+NewObj.name+“
” +“地址”+NewObj.propAddress+“
” +“说明”+NewObj.Description+“
” +“租金收入”+NewObj.RentalIncome; }
我知道这一点。但是我不能写每个列,因为有200多个列,并且列名根据存储过程的参数而改变。我如何将它们合并为一个?基本上,我想要的是连接两个数据表,并获得两个类似于sql中select*的列。有什么方法可以做到这一点吗?我知道你想要实现的目标,但是你需要编写一些代码来实现:一个代表你的行项目的类型。我仍然需要在这里提到每个特定的名称。我不希望这会给每行两个属性。如何将它们合并为一个?可以使用Linq的并集运算符
     DataTable targetTable = dsResults.Tables[0].Clone();
        var dt2Columns = dsResults.Tables[1].Columns.OfType<DataColumn>().Select(dc =>
            new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
        targetTable.Columns.AddRange(dt2Columns.ToArray());
        var rowData =
            from row1 in dsResults.Tables[0].AsEnumerable()
            join row2 in dsResults.Tables[1].AsEnumerable()
                on row1.Field<decimal>("RecordId") equals row2.Field<decimal>("RecordId2")
            select row1.ItemArray.Concat(row2.ItemArray).ToArray();
        foreach (object[] values in rowData)
            targetTable.Rows.Add(values);
  public string ShowNew(string myName)
        {
            RENTALEntities objD = new RENTALEntities();
            var NewObj =
                (from t in objD.TENANTs.ToList()
                 join pt in objD.PROP_TYPE.ToList()
                    on t.Prop_ID equals pt.Prop_ID
                 where t.Surname == myName
                 select new { t.Surname, t.PropAdress, pt.DESCRIPTION, t.RentalIncome }).First();

            return "SWurname" + NewObj.Surname + "<br/>"
                + "Address" + NewObj.PropAdress + "<br/>"
                + "Description" + NewObj.DESCRIPTION + "<br/>"
                + "Rental income" + NewObj.RentalIncome;
        }