2010-04-06 15 views
10

Mein Gehirn scheint jetzt Brei zu sein! Ich verwende LINQ zu Entität, und ich muss einige Daten aus einer Tabelle abrufen, die nicht in einer anderen Tabelle vorhanden ist.LINQ to Entity, Beitritt auf NOT IN Tabellen

Zum Beispiel: Ich brauche die groupID, groupname und groupnumber aus TABELLE A, wo sie nicht in TABELLE B vorhanden sind. Die groupID wird in TABELLE B zusammen mit anderen relevanten Informationen vorhanden sein. Die Tabellen haben keine Beziehung. In SQL wäre es ganz einfach sein (es ist eine elegante und effiziente Lösung, aber ich mag ein Bild von malen, was ich brauche)

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

Gibt es eine einfache/elegante Möglichkeit, dies mit dem Entity Framework zu tun/LINQ zu Entität? Im Moment habe ich eine Reihe von Anfragen, die die db treffen, dann vergleichen usw. Es ist ziemlich unordentlich.

Antwort

14

Sie jede

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

Sollte die innere Klausel 'y => y.GroupID == x.GroupID' sein? (gibt false zurück, wenn es irgendwelche Einträge in 'TableB' mit dieser' GroupID' gibt) – Hannele

+0

@Hannele Technisch ist es dasselbe und wahrscheinlich besser lesbar. Aus irgendeinem Grund wurde ich gebaut, um boolsche Logik rückwärts zu machen. – Nix

+0

Ich stimme Hannele zu, ich denke es sollte wo sein (x =>! Context.TableB.Any (y => y.GroupID == x.GroupID)) – Sam

4

Es hängt davon ab, wie Sie sie getroffen haben, die Sie nicht zeigen, aber im Allgemeinen:

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 verwenden könnte - Ihre Ergebnismenge sollte entweder waren:

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(); 

Oder

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(); 

Aber NICHT beide, wie Sie es geschrieben haben.

Verwandte Themen