linq to sql: указание JOIN вместо LEFT OUTER JOIN - PullRequest
5 голосов
/ 04 апреля 2011

Учитывая, что у меня есть три стола: Транспортные средства, Автомобили, Велосипеды. И Автомобили, и Мотоциклы имеют 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();

1 Ответ

6 голосов
/ 04 апреля 2011

Что ж, предложение Where кажется разумным, или вы можете использовать фактическое соединение, предполагая, что у вас есть свойство CarID или что-то подобное:

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