2015-06-10 60 views
0

VS 2013,EF6代碼第一次爲什麼有時使用.Date和EF工作,但不是其他工作?

我使用這個代碼,它工作正常:

var timeslots = Vehicle.VehicleTimeSlots.Where(t => 
    t.CreateDate.Date <= currentDate.Date 
    && (t.DeleteDate == null || t.DeleteDate.Value.Date > currentDate.Date) 
    && t.DayOfWeek == dayOfWeek).OrderBy(t => t.StartTime); 

但是,如果我嘗試這樣做,我得到一個運行時錯誤「指定的類型成員的日期'在LINQ to Entities中不受支持,只支持初始化器,實體成員和實體導航屬性。「 (DB是我的DbContext的一個實例):

var previousReservation = db.ReservationTimeSlots.SingleOrDefault(t => 
    t.ReservationDate.Date == reservationTimeslot.ReservationDate.Date 
    && t.VehicleTimeSlotId == reservationTimeslot.VehicleTimeSlotId); 

有一個關於這個問題許多其他問題,我知道我可以在代碼的後位(這我現在所做的使用DbFunctions.TruncateTime() )。我猜想不同之處在於,第一位代碼是針對Vehicle實體對象進行操作的,而第二位代碼是直接針對DbContext進行操作的。不是他們都是LINQ to Entities嗎?

+0

在Entity Framework中添加對此的支持相對容易。 – Aron

+0

「修復」是將'reservationTimeslot.ReservationDate.Date'存儲在局部變量中並在查詢中使用該局部變量。就「表達」而言,該值將是一個常數。 –

+0

儘管我將「reservationTimeslot.ReservationDate.Date」存儲在本地變量中,但我仍然認爲't.ReservationDate.Date'仍然存在問題。 – Lex

回答

3

你回答了你自己的問題。您是對的,第一個查詢是針對內存中的對象Vehicle)進行操作的,因此您可以使用任何屬性/功能。

儘管第二個LINQ表達式將被轉換爲基礎數據源語言(可能是SQL),並且每個表達式在實體框架中沒有可用的等效轉換。

雖然它們都是LINQ to Entities嗎?

不,第一個是LINQ to objects和LINQ to entities中的第二個表達式。

相關問題