C# 即使外键为空,也要连接两个数据表

C# 即使外键为空,也要连接两个数据表,c#,linq,C#,Linq,我的应用程序中有2个数据表。第一个数据表称为Table1,如下所示 ------------------------------------- | Key | Column1 | Column2 | Foreign | |-----------------------------------| | 0 | dsfsfsd | sdfsrer | 1 | |-----------------------------------| | 1 | dertert | qweqweq

我的应用程序中有2个数据表。第一个数据表称为
Table1
,如下所示

-------------------------------------
| Key | Column1 | Column2 | Foreign |
|-----------------------------------|
|  0  | dsfsfsd | sdfsrer |    1    |
|-----------------------------------|
|  1  | dertert | qweqweq |   NULL  |
|-----------------------------------|
|  2  | prwersd | xzcsdfw |    3    |
-------------------------------------
----------------------------------------
|  Key   | Column3 | Column4 | Column5 |
|--------------------------------------|
|   1    | dsfsfsd | sdfsrer | fghfghg |
|--------------------------------------|
|   3    | prwersd | xzcsdfw | nbmkuyy |
----------------------------------------
第二个叫做
Table2
,看起来像这样

-------------------------------------
| Key | Column1 | Column2 | Foreign |
|-----------------------------------|
|  0  | dsfsfsd | sdfsrer |    1    |
|-----------------------------------|
|  1  | dertert | qweqweq |   NULL  |
|-----------------------------------|
|  2  | prwersd | xzcsdfw |    3    |
-------------------------------------
----------------------------------------
|  Key   | Column3 | Column4 | Column5 |
|--------------------------------------|
|   1    | dsfsfsd | sdfsrer | fghfghg |
|--------------------------------------|
|   3    | prwersd | xzcsdfw | nbmkuyy |
----------------------------------------
所以我想使用LINQ对这两个表进行内部连接,这样连接的表看起来像这样。如果链接到
Table2
的外键为空,我不想丢失
Table1
中的数据

---------------------------------------------------------
| Key | Column1 | Column2 | Column3 | Column4 | Column5 |
|-------------------------------------------------------|
|  0  | dsfsfsd | sdfsrer | dsfsfsd | sdfsrer | fghfghg |
|-------------------------------------------------------|
|  1  | dertert | qweqweq |  NULL   |  NULL   |  NULL   | // This row is missing in my application
|-------------------------------------------------------|
|  2  | prwersd | xzcsdfw | prwersd | xzcsdfw | nbmkuyy |
---------------------------------------------------------
这是我试过的

var query = from table1Row in Table1.AsEnumerable()
            join table2Row in Table2.AsEnumerable()
                on table1Row.Foreign equals table2Row.Key
            select new SelectedColumns
            {
                Column1 = table1Row.Column1
                Column2 = table1Row.Column2
                Column3 = table2Row.Column3
                Column4 = table2Row.Column4
                Column5 = table2Row.Column5
            }
但是,此LINQ查询跳过不匹配的记录。我能做些什么来获得上述结果


解决方案:所以C.J.的回答为我指明了正确的方向。我将查询改为

var query = from table1Row in Table1.AsEnumerable()
            join table2Row in Table2.AsEnumerable()
                on table1Row.Foreign equals table2Row.Key into leftJoin
            from table2Row in leftJoin.DefaultIfEmpty()
            select new SelectedColumns
            {
                Column1 = table1Row.Column1
                Column2 = table1Row.Column2
                Column3 = table2Row.Column3
                Column4 = table2Row.Column4
                Column5 = table2Row.Column5
            }
但是,现在它抛出异常
值不能为null。参数名称:行
。事实证明,当您选择想要的字段时,需要使用布尔表达式来检查值是否为NULL。所以我把那个部分更新为

Column1 = table1Row.Field<COLUMN_TYPE?>("COLUMN_TYPE")
Column2 = table1Row.Field<COLUMN_TYPE?>("Column2")
Column3 = table2Row == null ? (COLUMN_TYPE?)null : table2Row.Field<COLUMN_TYPE?>("Column3")
Column4 = table2Row == null ? (COLUMN_TYPE?)null : table2Row.Field<COLUMN_TYPE?>("Column4")
Column5 = table2Row == null ? (COLUMN_TYPE?)null : table2Row.Field<COLUMN_TYPE?>("Column5")
Column1=table1Row.Field(“列类型”)
Column2=表1下方字段(“Column2”)
Column3=table2Row==null?(列类型?)null:table2Row.字段(“列3”)
Column4=table2Row==null?(列类型?)null:table2Row.字段(“列4”)
Column5=table2Row==null?(列类型?)null:table2Row.字段(“列5”)

它成功了。确保将
COLUMN\u TYPE
更新为该特定列的类型。
SelectedColumns
中的对象也都是可为空的


请参阅此页:

此文件的可能副本为我指明了正确的方向。我更新了我的问题,让它为我工作