Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 使用2个数据表进行查询_C#_Datagridview_Datatable - Fatal编程技术网

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
}));
//此时,您将获得所需的数据。
}