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 № 1Wię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()