在linq加入问题

时间:2010-10-04 09:38:34

标签: linq linq-to-sql

我有以下表格

T1    
    ====   ======
     ID     Desc
    ====   ======
     1       t1
     2       t2
     3       t3
     4       t4


T2
=====   =======  ========
 ID      T1ID     PT1ID
=====    ======  =========
 1        2         1
 2        3         2

在T2中,T1ID和PT1ID都是T1的外键。在我的输出中,我想要ID = 4的行,因为它在两个外键列中没有任何匹配的行

3 个答案:

答案 0 :(得分:1)

我不是100%清楚你想要做什么。

我假设您要返回T1中的所有行以及来自T2的所有匹配行,其中列T1ID或PT1ID值等于T1 ID列。

如果是这种情况,则需要外连接。您可以从MSDN microsoft Forums

获得外部联接的一个很好的示例

答案 1 :(得分:1)

如果您的问题是要进行外部联接: http://msdn.microsoft.com/en-us/library/bb399397.aspx

如果你的问题是要回归差异: msdn.microsoft.com/en-us/library/bb386962.aspx

答案 2 :(得分:1)

这应该是你想要的:

var notInT2 = T1.Where(i => T2.All(e => e.T1ID != i.Id) &&
                            T2.All(e => e.PT1ID != i.Id));

测试它:

class RowT1 { public Int32 Id;}
class RowT2 { public Int32 T1ID; public Int32 PT1ID;    }

class Programm
{
    static void Main()
    {
        var T1 = new List<RowT1>(){new RowT1(){Id=1},
                                   new RowT1(){Id=2},
                                   new RowT1(){Id=3},
                                   new RowT1(){Id=4}};

        var T2 = new List<RowT2>(){new RowT2(){T1ID=2, PT1ID=1}, 
                                   new RowT2(){T1ID=3, PT1ID=2}};

        var notInT2 = T1.Where(i => T2.All(e => e.T1ID != i.Id) &&
                                    T2.All(e => e.PT1ID != i.Id));

        Console.ReadLine();
    }
}
相关问题