0

我在 C# 中有一个这种格式的 LINQ 类:

class Vehicle
{
  int _VehicleID
  int _ModelID

  EntetySet<Cars> _AllCars
  EntetySet<Bus> _AllBus
  EntetyRef<Driver> _Person
}

汽车表

CarsID | Manufacturer | Type
1000   | Honda        | Diesel
1001   | Mitsubishi   | Petrol
1002   | Maruti       | Diesel

总线表

BusID | Manufacturer | Type
2000  | Volvo        | Diesel
2001  | TATA         | Petrol
2002  | layland      | Petrol

从 UI 中,我将获取车辆 ID 作为参数。基于此,所有的汽车、巴士及其关联的表都将被复制到一个变量中。那是:

Vehicle v1 = new Vehicle();
v1 = dc.vehicle.where(v => v.vehicleID == param.vehicleID).findfirst();

v1拥有满足上述条件的所有表格及其内容。

现在,我想根据桌面汽车和公共汽车中存在的表格内容进行更多过滤;即基于车辆汽油或柴油的类型。

如果我想在一行中使用查询语句复制所有汽油车和公共汽车,请告诉我方法。

提前致谢。

4

2 回答 2

2

**根据评论编辑**

你问题的逻辑不知何故被我忽略了,因为我在车辆上采取了合乎逻辑的人类方法。每当我看到这个时,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();
于 2012-10-22T14:19:31.183 回答
1

看来你想要这样的东西:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID
                            && v.Cars.All(c => c.Type == "Petrol")
                            && v.Buses.All(c => c.Type == "Petrol")).First();

)

获得所有汽车和公共汽车都有汽油的“车辆”。(请注意,我使用“Cars”而不是非常规名称“_AllCars”等)。

编辑

或者:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID)
    .Select(v => new {
                        Id = v.vehicleID,
                        Cars = v.Cars.Where(c => c.Type == "Petrol"),
                        Buses = v.Buses.Where(c => c.Type == "Petrol")
                     }).First();

获取带有过滤集合的匿名类型。

于 2012-10-22T14:17:07.227 回答