2017-04-10 2 views
0

Ich muss anstelle von Enthält gleich verwenden. Ich habe eine Reihe von Codes genannt selectedDeviceTypeIDs i annehmen, dass es zwei Codes hat {1,2}LINQ gleich anstelle von Enthält

ich aus der Abfrage führen müssen, wenn Geräte-IDs sind genau {1,2} so habe ich selectedDeviceTypeIDs.Contains mit selectedDeviceTypeIDs ersetzen .equal oder so ähnlich ...

m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID) 

if (DeviceTypeIDs != null) 
{ 
    Guid[] selectedDeviceTypeIDs = DeviceTypeIDs.Split(',').Select(Guid.Parse).ToArray(); 
    query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units.Any(m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID))))); 
} 
+0

warum verwenden Sie nicht Schleife und überprüfen Sie für gleiche Daten? – Bharat

+0

@Bharat Da würde es erforderlich sein, den gesamten Datensatz in den Speicher zu bringen, und das sieht für mich wie eine Entity Framework-Abfrage aus. – DavidG

+0

Normalerweise teste ich für nicht gleich mit einer Zählung von 0 was bedeutet, dass alles übereinstimmt. Benutze auch das Where ((x, i) => .... So etwas wie where ((j, i) => (j.HospitalDepartments! = SelectedDeviceTypeIDs [i])). Count == 0 – jdweng

Antwort

0

Option 1:

Wenn Sie über die Reihenfolge der Elemente kümmern, verwenden SequenceEqual Erweiterungsmethode. Dies wird return false, auch wenn die Sammlung die Elemente hat, aber in einer anderen Reihenfolge

m => m.Devices.Any(w => selectedDeviceTypeIDs.SequenceEqual(w.DeviceTypeID) 

Option 2:

Wenn Sie über den Auftrag nicht kümmern, verwenden All Erweiterungsmethode. Dies wird wahr zurückgegeben, wenn die Elemente in beiden Sammlungen unabhängig von der Reihenfolge identisch sind.

m => m.Devices.Any(w => selectedDeviceTypeIDs.All(w.DeviceTypeID.Contains) 
+0

Ranjith V. Vielen Dank für Ihre Hilfe ... ich versuchte den obigen Code ... es gibt mir Fehler, weil w.DeviceTypeID eine Eigenschaft nicht Array ist, ich kann es nicht mit selectedDeviceTypeIDs vergleichen ich denke, ich muss erhalten eine Liste von w.DeviceTypeID und dann vergleichen Sie es mit selectedDeviceTypeIDs ... können Sie mir bitte helfen, es [img] (http://i.imgur.com/METdXiz.jpg) – Alex

0

Verwenden ! .except(). Any() um sicherzustellen, dass m.Devices nicht enthält keine DeviceTypeID nicht in selectedDeviceTypeIDs

query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units 
.Where(m => !m.Devices.Select(w => w.DeviceTypeID).Except(selectedDeviceTypeIDs).Any()))); 
+0

Lieber Innat3, ich zu lösen Ich würde dir so sehr für deine Hilfe und deinen Einsatz danken ... Ich habe deinen Code tatsächlich ausprobiert, es hat nicht funktioniert ... aber vielleicht, weil wir wo zweimal ...Ich bin mir sicher, wenn Sie einen Blick auf den Code wieder es funktioniert, vielen Dank noch einmal – Alex

+0

Innat3 Es tut mir leid, wenn Sie beschäftigt sind – Alex

0

Sie benötigen Überprüfen Sie, ob die selectedDeviceTypeIDs jedes Gerät enthält und dass jedes Gerät selectedDeviceTypeIDs enthält. Sie könnten dies verwenden:

query = query 
.Where(j => 
    j.HospitalDepartments.Any(jj => 
     jj.Units.Any(m => 
      m.Devices.All(
       w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)) 
      && 
      selectedDeviceTypeIDs.All(
       g => m.Devices.Select(d => d.DeviceTypeID).Contains(g)) 
     ) 
    ) 
); 
+0

Granit, ich bearbeitet die Frage und löste es. Vielen Dank für Ihre Hilfe und Mühe :) – Alex

+0

@Alex erhalten Sie nicht das gleiche Ergebnis, indem Sie den Code in meiner Antwort und den, den Sie in Ihrer aktualisierten Frage geschrieben haben, verwenden? – granit

Verwandte Themen