2013-03-12 82 views
2

我希望能够返回可在特定日期之间自由预订的Vehicle对象列表。实体框架不会比较在不同时间返回的相同对象

我有一种方法可以返回那些日子之间当前在数据库中的预订列表,并且每个预订都有一个相关的车辆对象,所以我知道所有不可用的车辆。

我有另一种方法,返回数据库中的所有车辆的列表,但我需要一种方式比较Booking.Vehicle与从列表中返回的车辆对象。

我想这

foreach(var booking in bookings) 
{ 
    allVehicles.Remove(booking.Vehicle) 
} 

但车辆不会删除,为什么对象不能正确进行比较?尽管它的车辆物件被移除。

//Testing to see if the objects compare as expected (they don't) 
public static List<Vehicle> AvaliableVehiclesBetween(DateTime StartDate, DateTime EndDate) 
{ 

    List<Booking> bookings = Booking.BookingsBetween(StartDate, EndDate); 
    List<Vehicle> vehicles = AllVehicles(); 
    Vehicle v = vehicles[0]; 
    if(bookings[0].Vehicle.Equals(v)) { 
     vehicles = null; 
    } 

    return vehicles; 
} 

我运行这个车后不等于null; enter image description here

回答

1

你可以尝试使用只是主键〜ID为您匹配

var bookedIDs = bookings.Select(b => b.Vehicle.ID).ToList(); 
var freeVehicles = allVehicles.Where(v => !bookedIDs.Contains(v.ID)); 

至于你的实际问题,你可能没有你的对象比较的设置,所以它是由内存比较位置/参考。 What is the best way to compare two entity framework entities?

+0

我觉得你的代码是预约ID的比较车辆的ID,这将产生不正确的结果。 – danludwig 2013-03-12 12:42:51

+0

@ danludwig - 良好的捕捉,编辑。 – 2013-03-13 15:31:27

+0

另外一个捕获 - 因为'presetIDs'不会用于集合操作(​​'.Add','.Remove'等),所以使用'.ToArray()'而不是'.ToList()'。如果'.Contains(v.ID)'是唯一使用它的地方,你甚至可以完全忽略它,因为在这种情况下它将被自动枚举。 – danludwig 2013-03-13 15:52:12

0

你可以做两件事。 1)如果需要比较整个对象,则需要将两个对象序列化为任意格式(XML),然后进行比较。因为对象包含一些元数据,可能不等于。 2)你可以比较两个对象的任何属性,如“VehicleId”。

public static List<Vehicle> AvaliableVehiclesBetween(DateTime StartDate, DateTime EndDate) 

{

List<Booking> bookings = Booking.BookingsBetween(StartDate, EndDate); 
List<Vehicle> vehicles = AllVehicles(); 
Vehicle v = vehicles[0]; 
if(bookings[0]!=null && v!=null) 
{ 
    if(bookings[0].Vehicle.VehicleId.Equals(v.VehicleId)) 
    { 
    vehicles = null; 
    } 
} 
return vehicles; 

}