2013-01-08 109 views
0

我试图根据两个日期时间过滤日期。 MinTimeMaxTime在SQL都为空的DateTime是否,我想基于这些筛选,但我得到一个错误:实体框架日期时间函数

This function can only be invoked from LINQ to Entities

public static IEnumerable<ExclusionRule> GetExclusionRules(AppointmentTypes? apptType, string resourceName, TimeSpan? minTime, TimeSpan? maxTime, DayOfWeek? day) { 
    using (var db = new BusinessObjectContainer()) { 
     db.ExclusionRules.MergeOption = MergeOption.NoTracking; 
     var items = db.ExclusionRules; 
     int intDay = day.HasValue ? (int) day.Value : -1, 
      intApptType = apptType.HasValue ? (int)apptType.Value : -1; 
     var filteredApptType = apptType.HasValue ? items.Where(i => !i.t_AppointmentType.HasValue|| i.t_AppointmentType == intApptType) : items; 
     var filteredResource = string.IsNullOrWhiteSpace(resourceName) ? filteredApptType : filteredApptType.Where(i => !string.IsNullOrEmpty(i.ResourceName) && resourceName.ToLower().Equals(i.ResourceName.ToLower())); 

     IEnumerable<ExclusionRule> filteredMinDate; 
     if (minTime.HasValue) { 
      filteredMinDate = filteredResource.Where(i => (!i.MinTime.HasValue) || (EntityFunctions.CreateTime(i.MinTime.Value.Hour, i.MinTime.Value.Minute, 0) >= minTime.Value)); 
     } else { 
      filteredMinDate = filteredResource; 
     } 

     IEnumerable<ExclusionRule> filteredMaxDate; 
     if (maxTime.HasValue) { 
      // this throws the exception 
      filteredMaxDate = filteredMinDate.Where(i => (!i.MaxTime.HasValue) || EntityFunctions.CreateTime(i.MaxTime.Value.Hour, i.MaxTime.Value.Minute, 0) <= maxTime.Value); 
     } else { 
      filteredMaxDate = filteredMinDate; 
     } 
     var filteredWeekDay= day.HasValue ? filteredMaxDate.Where(i => !i.t_DayOfWeek.HasValue|| i.t_DayOfWeek == intDay) : filteredMaxDate; 
     return filteredWeekDay.ToList(); 

回答

1

你*在上一个IEnumerable<ExclusionRule>一个LINQ语句中使用EntityFunctions。但是您只能在具有实体框架查询提供程序的IQueryable上使用它。所以你应该从IQueryable<ExclusionRule>(来自EF)开始,或者以regular.Net方式创建DateTime

* DbFunctions作为实体框架的6

0

我通过在DateTime过滤之前调用.ToList()来解决这个问题。这会将所有东西都拉到.NET中,因此查询可以在那里完成。

由于数据库中的项目数量相对较少,所以这不成问题。