2013-03-12 35 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; 

}

相關問題