C# 如何在使用linq将两个datatable的列进行内部连接后获取它们
我的linq如下所示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
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;
}