2017-09-13 2 views
1

Ich versuche, diese SQL-Abfrage in LINQ zu erstellen:LINQ Unterabfrage mit mehreren Spalten

SELECT * 
FROM Policies 
WHERE PolicyID IN(SELECT PolicyID 
        FROM PolicyRegister 
        WHERE PolicyRegister.StaffNumber = @CurrentUserStaffNo 
          AND (PolicyRegister.IsPolicyAccepted = 0 
           OR PolicyRegister.IsPolicyAccepted IS NULL)) 

Beziehungsdiagramm für die beiden Tabellen:

Relationship Diagram

Hier ist mein Versuch so weit:

Ich denke, ich bin in der Nähe, werde wahrscheinlich zwei Listen erstellen und Inters verwenden ect() irgendwie, aber ich habe heute Morgen meinen Code angeschaut und dachte, dass es einen einfacheren Weg dafür geben muss. LINQ soll eine lesbare Datenbanksprache sein, oder?

Jede Hilfe wird sehr geschätzt.

+2

db.Policies.Where (p => policyRegisterIds .Contains (p.PolicyID)) – jitender

+1

versuchen 'policyRegisterIds.Contains (p.PolicyID)', aber Es ist besser, einen Join zu machen, um die Anzahl der Anfragen zu minimieren – ASpirin

+2

Haben Sie eine virtuelle Beziehung zwischen "Policies" und "PolicyRegisters"? Fügen Sie die Strukturen in Frage – meorfi

Antwort

2

Verwenden Sie einfach Contains:

var policies = db.Policies.Where(p => policyRegisterIds.Contains(p.PolicyID)); 

auch besser speichern policyRegisterIds als HashSet<T> statt einer Liste für die Suche in O(1) statt O(n) von List<T>:

var policyRegisterIds = new HashSet<IdType>(db.PolicyRegisters......); 

Aber besser ist immer noch diezu entfernenund lassen Sie es alle als eine Abfrage in der Datenbank vorkommen:

var policyRegisterIds = db.PolicyRegisters.Where(pr => pr.StaffNumber == staffNumber && 
          (pr.IsPolicyAccepted == false || pr.IsPolicyAccepted == null)); 

var policies = db.Policies.Where(p => policyRegisterIds.Any(pr => pr.PolicyID == p.PolicyID)); 
+2

Daumen hoch für 'HashSet ' Vorschlag –

+1

@EhsanSajjad - Ich mag es auch :) und wenn es im Speicher linq war würde ich sicher gehen –

+0

Danke, das war eine große Hilfe :) – TridentTrue