代码之家  ›  专栏  ›  技术社区  ›  Tassadaque

LINQ中的连接问题

  •  2
  • Tassadaque  · 技术社区  · 14 年前

    我有以下几张桌子

    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 回复  |  直到 13 年前
        1
  •  1
  •   sloth    13 年前

    这应该是你想要的:

    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();
        }
    }
    
        2
  •  1
  •   TheLukeMcCarthy    14 年前

    我不完全清楚你想做什么。

    我假设您要返回T1中的所有行和T2中的任何匹配行,其中列t1 id或pt1id值等于T1 id列。

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

        3
  •  1
  •   Spilarix    14 年前

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

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