2015-06-10 59 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中的第二个表达式。

相关问题