C# 使用2个数据表进行查询
我有两个数据表:C# 使用2个数据表进行查询,c#,datagridview,datatable,C#,Datagridview,Datatable,我有两个数据表: dt1: dt2: | id | num | value | | id | num | name | |----+-----+-------| |----+-----+-----------| | 99| 1| + | | 99 | 1| tiger | | 100| 2| + | | 100| 2|
dt1: dt2:
| id | num | value | | id | num | name |
|----+-----+-------| |----+-----+-----------|
| 99| 1| + | | 99 | 1| tiger |
| 100| 2| + | | 100| 2| pigeon |
| 101| 1| - | | 101| 1| crocodile |
| 102| 1| + | | 102| 1| panther |
| 105| 1| whale |
我想将其绑定到一个数据表:
| id | num | value | name |
|----+-----+-------+----------|
| 99 | 1| + |tiger |
| 100| 2| + |pigeon |
| 101| 1| - |crocodile |
| 102| 1| + |panther |
| 105| 1| |whale |
之后,我将DataRow绑定到dataGridView
我试图创建一个查询,但其中有错误,它没有返回值:
var vquery = (from dt1 in dtable1.AsEnumerable()
from dt2 in dtable2.AsEnumerable()
where dt1.Field<int?>(IndexesField.F_LINK_ID) == dt2.Field<int?>(IndexesField.F_LINK_ID)
where dt1.Field<int?>(IndexesField.F_TABKEY) == dt2.Field<int?>(IndexesField.F_TABKEY)
select new { dt1, dt2 });
var vquery=(来自dtable1.AsEnumerable()中的dt1)
从DTTable2.AsEnumerable()中的dt2
其中dt1.Field(IndexesField.F_LINK_ID)=dt2.Field(IndexesField.F_LINK_ID)
其中dt1.Field(IndexesField.F_TABKEY)=dt2.Field(IndexesField.F_TABKEY)
选择新的{dt1,dt2});
我需要做什么来纠正它
问候,,
Alexander。您应该在这里使用LINQ,而不是LINQ。如果您的
DataTable
s有一个主键,那么它将按照您的需要自动计算出来
dtable1.PrimaryKey = new[] { dtable1.Columns["id"] };
dtable2.PrimaryKey = new[] { dtable2.Columns["id"] };
dtable1.Merge(dtable2);
如果要使用LINQ,必须模拟外部联接以获得所需的值,然后将它们插入第三个数据表中
void Main()
{
DataTable dTable1 = new DataTable();
DataTable dTable2 = new DataTable();
dTable1.Columns.Add("id", typeof(int));
dTable1.Columns.Add("num", typeof(int));
dTable1.Columns.Add("value", typeof(string));
dTable2.Columns.Add("id", typeof(int));
dTable2.Columns.Add("num", typeof(int));
dTable2.Columns.Add("name", typeof(string));
dTable1.Rows.Add(new object [] { 99, 1, "+"});
dTable1.Rows.Add(new object [] { 100, 1, "+"});
dTable1.Rows.Add(new object [] { 101, 1, "-"});
dTable1.Rows.Add(new object [] { 102, 1, "+"});
dTable2.Rows.Add(new object [] { 99, 1, "tiger"});
dTable2.Rows.Add(new object [] { 100, 1, "pigeon"});
dTable2.Rows.Add(new object [] { 101, 1, "crocodile"});
dTable2.Rows.Add(new object [] { 102, 1, "panther"});
dTable2.Rows.Add(new object [] { 105, 1, "whale"});
var vQuery = (from dt1 in dTable1.AsEnumerable()
join dt2 in dTable2.AsEnumerable()
on new { Id = dt1.Field<int?>(0), Num = dt1.Field<int?>(1) }
equals new { Id = dt2.Field<int?>(0), Num = dt2.Field<int?>(1) }
into temp
from defaultDt2 in temp.DefaultIfEmpty(null)
select new {
id = (dt1 ?? temp.First()).Field<int?>(0),
num = (dt1 ?? temp.First()).Field<int?>(1),
value = dt1 != null ? dt1.Field<string>(2) : null,
name = temp.First() != null ? temp.First().Field<string>(2) : null
}).Concat(
(from dt1 in dTable2.AsEnumerable()
join dt2 in dTable1.AsEnumerable()
on new { Id = dt1.Field<int?>(0), Num = dt1.Field<int?>(1) }
equals new { Id = dt2.Field<int?>(0), Num = dt2.Field<int?>(1) }
into temp
from defaultDt2 in temp.ToList<DataRow>().DefaultIfEmpty(null)
select new
{
id = (temp.FirstOrDefault() ?? dt1).Field<int?>(0),
num = (temp.FirstOrDefault() ?? dt1).Field<int?>(1),
value = temp.FirstOrDefault() != null ? temp.FirstOrDefault().Field<string>(2) : null,
name = dt1 != null ? dt1.Field<string>(2) : null
}));
// At this point you will have the data you're after.
}
void Main()
{
DataTable dTable1=新的DataTable();
DataTable dTable2=新的DataTable();
dTable1.Columns.Add(“id”,typeof(int));
dTable1.Columns.Add(“num”,typeof(int));
dTable1.Columns.Add(“value”,typeof(string));
dTable2.Columns.Add(“id”,typeof(int));
dTable2.Columns.Add(“num”,typeof(int));
dTable2.Columns.Add(“name”,typeof(string));
添加(新对象[]{99,1,“+”});
添加(新对象[]{100,1,“+”});
添加(新对象[]{101,1,“-”});
添加(新对象[]{102,1,“+”});
添加(新对象[]{99,1,“tiger”});
添加(新对象[]{100,1,“鸽子”});
添加(新对象[]{101,1,“鳄鱼”});
添加(新对象[]{102,1,“panther”});
添加(新对象[]{105,1,“whale”});
var vQuery=(来自dTable1.AsEnumerable()中的dt1)
将dt2连接到dTable2.AsEnumerable()中
在新的{Id=dt1.Field(0),Num=dt1.Field(1)}
等于新的{Id=dt2.Field(0),Num=dt2.Field(1)}
变成临时工
来自临时DefaultIfEmpty(null)中的defaultDt2
选择新的{
id=(dt1??温度第一()).字段(0),
num=(dt1??temp.First()).字段(1),
value=dt1!=null?dt1。字段(2):null,
name=temp.First()!=null?temp.First()字段(2):null
})康卡特先生(
(来自DTTable2.AsEnumerable()中的dt1)
将dt2连接到dTable1.AsEnumerable()中
在新的{Id=dt1.Field(0),Num=dt1.Field(1)}
等于新的{Id=dt2.Field(0),Num=dt2.Field(1)}
变成临时工
来自temp.ToList()中的defaultDt2.DefaultIfEmpty(null)
选择新的
{
id=(临时FirstOrDefault()??dt1).字段(0),
num=(temp.FirstOrDefault()???dt1).字段(1),
value=temp.FirstOrDefault()!=null?temp.FirstOrDefault()字段(2):null,
name=dt1!=null?dt1.字段(2):null
}));
//此时,您将获得所需的数据。
}