Учитывая, что у меня есть три стола: Транспортные средства, Автомобили, Велосипеды. И Автомобили, и Мотоциклы имеют VehicleID FK, который связан с Транспортными средствами.
Я хочу сосчитать все транспортные средства, которые являются такими автомобилями.
Vehicles.Select(x=>x.Car).Count();
Однако, это даст мне ВСЕ ряды транспортных средств и поместит ноль в строки, где тип транспортного средства - Мотоциклы.
Я использую linqpad для этого и, увидев SQL-отчет, я понял причину, по которой он это делает, потому что при соединении x.Car он выполняет ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ между транспортным средством и автомобилем, что означает, что он вернет все транспортные средства.
Если я изменю запрос на использование JOIN, он будет работать, как и ожидалось.
Есть ли способ указать linq выполнить объединение, используя этот тип синтаксиса?
В конечном итоге я хочу сделать что-то вроде:
Vehicles.Select(x=>x.Car.CountryID).Distinct().Dump();
Но из-за этой ошибки:
InvalidOperationException: The null value cannot be assigned to a member with type System.Int32 which is a non-nullable value type.
В итоге я делаю это:
Vehicles.Where(x=>x.Car!=null).Select(x=>x.Car.CountryID).Distinct().Dump();