**根据评论编辑**
你问题的逻辑不知何故被我忽略了,因为我在车辆上采取了合乎逻辑的人类方法。每当我看到这个时,Vehicle class
我都会立即将汽车和公共汽车视为交通工具。这更多地表明命名选择不当。但不再以我为判断。
我知道您想要一辆车的 ID,并且您希望结果仅包含乘坐汽油的汽车和公共汽车,例如汽油,在一条线上。如果它被翻译成 SQL,我不知道树在选择中可以走多远,但如果它在内存中,那么你可以在子选择中走很长的路。
您可以使用“模型”类来实现这一点,也可以使用匿名类型,但我将举一个“模型”类的示例:
例子:
public class VehicleModel
{
public int VehicleID { get; set; }
public int ModelID { get; set; }
public List<Cars> Cars { get; set; }
public List<Bus> Buses { get; set; }
}
var vehicleID = 1; // just for the example of course.
var fuelType = "Petrol";
var vehicle = (from v in dc.vehicle
where v._VehicleID == vehicleID
select new VehicleModel
{
VehicleID = v._VehicleID,
ModelID = v._ModelID,
Cars = v._AllCars.Where(car => car.Type == fuelType).ToList(),
Buses = v._AllBus.Where(bus => bus.Type == fuelType).ToList()
}).SingleOrDefault();
// use FirstOrDefault() when _VehicleID is NOT unique to get TOP 1
不要在 Entity 本身中修改 EntitySets,始终使用模型来处理这些事情,因为如果你这样做并在 EntityContainer 上调用 save changes ,各种事情都可能出错。
如果您想了解匿名类型,请查看此处:http:
//msdn.microsoft.com/en-us/library/bb397696 (v=vs.100).aspx
还可以在这里查看 Linq 示例:
http ://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
- 编辑前
你是这个意思吗:
var query = dc.vehicle.Where(v =>
v._AllCars.Any(c => c.Manufacturer == "Honda") ||
v._AllBuss.Any(b => b.Manufacturer == "Volvo"));
这将为您提供所有车辆是本田或公共汽车是沃尔沃的车辆。这将是:
1000 | 本田 | 柴油机
2000 | 沃尔沃 | 柴油机
结果是一个 IEnumerable,包含所有或不包含满足条件的项目。
如果你只想要第一次命中,你可以这样做:
//if it must exist, otherwise this throws an exception
var firstVehicle = query.First();
//if it may exist, otherwise null
var firstVehicle = query.FirstOrDefault();