2017-05-16 1 views
1

Ich habe die folgenden Tabellen in meiner Datenbank:IN subquery Verwendung in Entity Framework Linq mit

- Reservation 
- TrainStation 
- Train 
- Traveller 
- Reservation_Traveller 
- TrainSeats: Attributes are: Train_Id, Seat, Traveller_Id 

ich die TrainSeats Zeilen einer bestimmten Reservierung

Ich habe ein Reservation Objekt zu suchen, die eine enthält ICollection<Traveller> Eigenschaft, die Reisende enthält, von denen ich ihre Sitze vom TrainSeats-Tisch entfernen möchte. Ich holte die Reservierung Objekt aus der Datenbank wie folgt aus:

var reservation = db.Reservation.Where(r => r.Id == id).FirstOrDefault(); 

Also ich so etwas wie dies tun wollen:

db.TrainSeats.Where(ts => ts.Traveller_Id IN reservation.Travellers) 

Antwort

1

Wählen Sie zuerst die Reisenden ID:

var ids=reservation.Travellers.Select(e=>e.Id); 

Dann nutzen Contains Erweiterungsmethode, die in IN in sql übersetzt wird:

var query=db.TrainSeats.Where(ts => ids.Contains(ts.Traveller_Id)); 

Ich denke, wenn man die FK-Eigenschaft und Navigationseigenschaften verwenden Sie es in einer Abfrage tun können:

var query= db.Travellers.Where(e=>e.ReservationId==id).SelectMany(t=>t.TrainSeats); 
+0

Dies wird eine NotSupportedException verursacht, die Nachricht ist: { "Kann nicht einen konstanten Wert des Typs 'erstellen Reisender ". In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt. "} – Ferre12

+0

Haben Sie die IDs ausgewählt? Sie müssen eine Skalareigenschaft auswählen, die' Contains' verwendet, wie ich in meiner Antwort zeige, in Ihrem Fall wären dies Reisender-IDs Der Fehler liegt darin, dass Sie Contains verwenden, die mit Entitäten anstelle des Skalarwerts – octavioccl

+0

verglichen werden. Ich habe es funktioniert, es war eine andere Bedingung, die die Ausnahme verursacht hat. – Ferre12