2009-05-26 1 views
0

Ich habe zwei un-related (keine FKs definiert) -Tabellen. Die erste Tabelle enthält einige Aufgaben, auf die ein Benutzer möglicherweise keinen Zugriff hat. Ich muss alle diese Aufgaben finden - in diesem Fall würde die verbundene Tabelle Nullen enthalten. Wie bekomme ich sie?Linq zu Entities: Linke Join, um Elemente nicht in der Join gefunden

Hier ist das Setup:

TimeData table 
- userID 
- taskID 
- hours 


ApprovedTasks table (the one that should contain nulls) 
- taskID 
- userID 

Die SQL-Abfrage würde wie folgt aussehen:

select * from TimeData td 
left join ApprovedTasks at 
on at.taskID = td.taskID and at.userID = td.userID 
where at.taskID is null 

Jede Art und Weise, dass zu Entity-Abfrage mit einem LINQ to abziehen ?

TIA

+0

Die "Join" ist in der Tat ein Implementierungsdetail; Ich frage mich, ob Sie es nicht als eine disjunkte Union über Contains/Any/Except betrachten sollten. Ich habe kein handliches db, um es zu prüfen, obwohl ... –

+0

Die hinzugefügte Linie zur Frage hilft sicher !!!! – CSharpAtl

Antwort

3

Check out ... Disjoint Union in LINQ

Dies sollte funktionieren ...

var approvedTaks = from at in ApprovedTasks.Except(
             from at2 in ApprovedTasks 
             where at2.userID == userId and at2.taskID==taskId 
             select at2) 
        where at.userID == userId and at.taskID==taskId 
        select at; 

aber leider nicht auf die Datenbank haben praktisch zu testen.

+0

Danke David, ich werde gehen, geben Sie eine Chance. Auf den ersten Blick wette ich, dass das Entity-Framework "Außer" nicht implementiert hat ... wir werden es bald sehen. – bugfixr

+0

Ah ... aber Sie können immer noch die zwei Listen und dann eine Ausnahme auf ihnen mit einem List oder anderen Konstrukt die linq über ihnen laufen. Nur weil Sie Linq zu Entitäten verwenden, bedeutet das nicht, dass Sie es immer verwenden müssen. Ich vermute, sie haben, obwohl sie die damit verbundenen ANY implementiert haben. –

+0

Auf die Gefahr hin streitsüchtig ... würde man nicht vermeiden wollen, zwei Listen zu machen und dann das Ausgenommene tun? Das würde bedeuten, dass Sie die Daten aus dem DB-Server herausziehen und die Arbeit mit .net tun - ich würde schätzen, dass, um es zu optimieren, Sie die Last auf dem Datenbankserver behalten sollten. – bugfixr