/ / linq do sql: określenie DOŁĄCZ zamiast LEWEGO DOŁĄCZENIA ZEWNĘTRZNEGO - c #, linq, linq-to-sql, linqpad

linq do sql: określanie JOIN zamiast LEFT OUTER JOIN - c #, linq, linq-sql, linqpad

Biorąc pod uwagę, że mam trzy stoły: Pojazdy, Samochody, Motocykle. Zarówno samochody, jak i motocykle mają VehicleID FK, który łączy się z pojazdami.

Chcę policzyć wszystkie pojazdy, które są takimi samochodami.

Vehicles.Select(x=>x.Car).Count();

To mi jednak da WSZYSTKO rzędy pojazdów i ustaw puste na rzędy, w których typ pojazdu to Rowery.
Używam do tego linqpad i widzę sqlZrozumiałem, dlaczego tak się dzieje, ponieważ na złączeniu x.Car wykonuje POŁĄCZENIE ZEWNĘTRZNE między pojazdem a samochodem, co oznacza, że ​​zwróci wszystkie pojazdy. Jeśli zmienię zapytanie tak, aby korzystało z JOIN, działa ono zgodnie z oczekiwaniami.

Czy istnieje sposób, aby powiedzieć linq, aby wykonał złączenie przy użyciu tego typu składni? Ostatecznie chcę zrobić coś takiego:

Vehicles.Select(x=>x.Car.CountryID).Distinct().Dump();

Ale z powodu tego błędu:

InvalidOperationException: The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.

W końcu robię to:

Vehicles.Where(x=>x.Car!=null).Select(x=>x.Car.CountryID).Distinct().Dump();

Odpowiedzi:

6 dla odpowiedzi № 1

Więc to Where klauzula wydaje się uzasadniona lub możesz użyć rzeczywistego łączenia, zakładając, że masz właściwość CarID lub coś podobnego:

Vehicles.Join(Cars, v => v.CarID, c => c.ID, (v, c) => c.CountryID).Distinct()