为什么有时使用.Date和EF工作,而不是其他人?

时间:2015-06-10 14:42:37

标签: c# linq entity-framework

VS 2013,EF6 Code First

我正在使用此代码并且工作正常:

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不支持指定的类型成员'Date'。仅支持初始化程序,实体成员和实体导航属性。” ( 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吗?

1 个答案:

答案 0 :(得分:3)

你回答了自己的问题。你是对的,第一个查询是针对内存中对象Vehicle)运行的,因此你可以使用任何属性/功能。

而第二个LINQ表达式将被转换为基础数据源语言(可能是SQL),而每个表达式在实体框架中没有等效的转换。

  

它们不是LINQ to Entities吗?

不,第一个是LINQ to objects,LINQ中的第二个表达式是实体。