2010-04-06 71 views
10

我的大腦現在似乎很糟糕!我正在使用LINQ to Entity,我需要從另一個表中不存在的表中獲取一些數據。LINQ to Entity,加入NOT IN表

例如:我需要TABLE A中不存在的groupID,groupname和groupnumber,它們不會存在於TABLE B中。groupID將與其他相關信息一起存在於TABLE B中。這些表格沒有任何關係。在SQL這將是非常簡單的(還有一個更優雅和高效的解決方案,但我要畫什麼,我需要一個圖片)

SELECT 
    GroupID, 
    GroupName, 
    GroupNumber, 
FROM 
    TableA 
WHERE 
    GroupID NOT IN (SELECT GroupID FROM TableB) 

有一個簡單/優雅的方式來做到這一點使用實體框架/ LINQ到實體? 現在我有一堆查詢命中數據庫,然後比較等。這很麻煩。

回答

14

你可以使用任何

var temp =context.TableA 
     .Where(x=>!context.TableB.Any(y=>y.GroupID!=x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 
+0

如果內部子句是'y => y.GroupID == x.GroupID'? (如果'GroupB'中有'TableB'中的任何項目,則返回false) – Hannele 2013-10-03 18:43:30

+0

@Hannele技術上它是相同的,可能更具可讀性。出於某種原因,我被構建爲向後執行布爾邏輯。 – Nix 2013-10-04 12:07:48

+0

我同意Hannele,我認爲它應該是Where(x =>!context.TableB.Any(y => y.GroupID == x.GroupID)) – Sam 2016-03-03 08:12:41

4

這取決於你是怎麼認識他們,你不顯示,但一般:

var q = from a in Context.TableA 
     where !a.Group.TableBs.Any() 
     select new 
     { 
      GroupID = a.GroupID, 
      GroupName = a.GroupName, 
      GroupNumber = a.GroupNumber 
     }; 
1

@Nix - 您的結果集應或者被:

var temp =context.TableA 
     .Where(x=>context.TableB.Any(y=>y.GroupID != x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

或者

var temp =context.TableA 
     .Where(x=> ! context.TableB.Any(y=>y.GroupID == x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

但不是兩個,就像你寫的那樣。