Linq to sql 我可以有条件地投影到其他类型吗?

Linq to sql 我可以有条件地投影到其他类型吗?,linq-to-sql,inheritance,projection,Linq To Sql,Inheritance,Projection,如果我有一辆汽车、公交车和未知车辆,它们都是从车辆派生出来的,那么根据数据库中的“类型”字段,我可以根据条件投影到不同的类型吗 像这样: public IQueryable<Vehicle> GetAllVehicles() { return from vehicle in dc.Vehicles select vehicle.Type == "C" ? new Car(vehicle.ID) : vehicle.Type == "B" ? new Bus(vehic

如果我有一辆
汽车
公交车
未知车辆
,它们都是从
车辆
派生出来的,那么根据数据库中的“类型”字段,我可以根据条件投影到不同的类型吗

像这样:

public IQueryable<Vehicle> GetAllVehicles()
{
    return from vehicle in dc.Vehicles
    select vehicle.Type == "C" ? new Car(vehicle.ID) : vehicle.Type == "B" ? new Bus(vehicle.ID) : new UnknownVehicle(vehicle.ID);
}
public IQueryable GetAllVehicles()
{
从dc车辆中的车辆返回
选择vehicle.Type==“C”?新车(vehicle.ID):vehicle.Type==“B”?新总线(vehicle.ID):new UnknownVicheck(vehicle.ID);
}

您可以在Vehicle上创建一个静态FactoryMethod(这是一个模式),它将返回您需要的类的对象

诸如此类:

public class Vehicle
{
    ...
    public static Vehicle GetVehicle( VehicleType type, int id )
    {
        switch( type )
        {
            case 'C':
                return( new Car( id ) );
            case 'B':
                return( new Bus( id ) );
            default:
                return( new UnknownVehicle( id ) );

        }
    }
}
并在这样的代码中使用它

public IQueryable<Vehicle> GetAllVehicles()
{
    return( from vehicle in dc.Vehicles
        select Vehicle.GetVehicle( vehicle.Type, vehicle.ID ) );
}
public IQueryable GetAllVehicles()
{
返回(从dc车辆中的车辆返回
选择Vehicle.GetVehicle(Vehicle.Type,Vehicle.ID));
}

不过,要使开关工作,您的类型应该是char,而不是string。但是你还是用一种字母类型。

谢谢你的回复。是的,在内联条件之前我有过类似的经历。但是[switch语句]不能很好地转换为SQL(L2S例外),只要您使用Linq2Sql作为ORM,我认为您无法直接管理您想要的内容。L2S需要实体到表的映射。您可以使用Vehicle作为容器类,使用Car/Bus/UnknownHicle作为包含类/策略来处理不同类型车辆之间的不同行为。@Kaerber将Car/Bus/UnknownHicle作为包含类是什么意思?您的意思是像在
车辆
类型上有一个属性,其计算结果为
汽车
/
总线
/
未知车辆
?您可以基于抽象车辆策略将所有特定于类型的行为放入单独的类,CarStrategy/bustrategy/unknownhichelstrategy,并将所有对方法的相关调用路由到Strategy类。这样,尽管您的集合中只有一个Vehicle类,但每个实例都将根据其实际类型(Bus、Car等)进行操作。