【问题标题】:Entity Framework DateTime Functions实体框架日期时间函数
【发布时间】:2013-01-08 08:34:24
【问题描述】:

我正在尝试根据两个日期时间按日期过滤。 MinTimeMaxTime 在 SQL 中都是可为空的 DateTimes,我想根据这些进行过滤,但出现错误:

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();

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4


    【解决方案1】:

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

    *DbFunctions 从实体框架 6 开始。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-06
            • 2018-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-23
            • 2011-04-06
            相关资源
            最近更新 更多