LINQ to SQL:指定JOIN而不是LEFT OUTER JOIN

5

假设我有三个表,分别为Vehicles、Cars和Bikes。Cars和Bikes都有一个VehicleID外键,用于连接到Vehicles表。

我想要像这样计算所有车辆中的汽车数量。

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

然而,这将给我所有车辆的行,并在车辆类型为自行车的行中放置null。
我正在使用linqpad进行此操作,并查看sql语句后,我意识到它这样做的原因是因为在x.Car join上它执行了一个LEFT OUTER JOIN,vehicle和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

嗯,Where子句看起来很合理,或者您可以使用实际的联接,假设您有一个CarID属性或类似的东西:

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

这里的where很好用,直到我开始执行“Vehicles.Select(x=>x.Car.Producer.AnotherTable.Etc.Field)”这样的语句。我在想是否存在一种关系引用方式,不需要返回外部表的所有空值,这样可以最小化查询字符串。(考虑到联接的长度和繁琐性,如果没有更优雅的表达JOIN的方式,我会继续使用where) - Joe
@Joe:问题在于你的字段是可空的。对于非可空字段,这不会成为问题。 - Jon Skeet
@Jon,这很有趣。我不完全理解。当我将鼠标悬停在返回类型上时,选择返回的是IQueryable<int>。通常情况下,如果它是可空的,它会返回IQueryable<int?>。但是你的意思是因为车辆只能是汽车或自行车,所以车辆和汽车表之间并不总是存在关系吗? - Joe
@Joe:我的意思是Car属性是可空的...因为车辆并不总是与汽车相关联。所以在你的表中,CarID可能是一个可空字段。 - Jon Skeet
@Joe:不,这不会引发NullReferenceException,但从逻辑上讲应该,因为有些行在逻辑上具有空的“Car”属性。 - Jon Skeet
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接