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等)进行操作。