繁体   English   中英

实体框架DateTime函数

[英]Entity Framework DateTime Functions

我正在尝试根据两个日期时间按日期进行过滤。 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();

您正在IEnumerable<ExclusionRule>的linq语句中使用EntityFunctions *。 但是您只能在具有实体框架查询提供程序的IQueryable上使用它。 因此,您应该从IQueryable<ExclusionRule> (从EF开始)开始,或者仅以常规.Net方式创建DateTime

* DbFunctions自Entity Framework 6起。

MinTime.Value.Hour等可能必须在查询中执行,在我看来,您正在.Net内存中执行它们。 这就是为什么您得到错误。

LINQ实体: http : //msdn.microsoft.com/en-us/library/bb386964.aspx

This function can only be invoked from LINQ to Entities

EntityFunctions仅在LINQ to Entities查询中适用。

EntityFunctions类包含一些方法,这些方法公开了在LINQ to Entities查询中使用的规范函数。 http://msdn.microsoft.com/en-us/library/dd456873.aspx

我通过在DateTime过滤之前调用.ToList()解决了这个问题。 这会将所有内容都拉入.NET,因此可以在其中进行查询。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM