0

2 つの日時に基づいて日付でフィルター処理しようとしています。MinTimeこれらにMaxTime基づいてフィルタリングしたいのですが、エラーが発生しています:

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

4 に答える 4

2

EntityFunctions上の linq ステートメントで * を使用していIEnumerable<ExclusionRule>ます。ただし、Entity Framework クエリ プロバイダーを持つ IQueryable でのみ使用できます。したがって、IQueryable<ExclusionRule>(EF から) から開始するかDateTime、通常の .Net の方法で s を作成する必要があります。

* Entity Framework 6 のDbFunctions 。

于 2013-01-08T09:54:10.007 に答える
0

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

于 2013-01-08T10:22:13.407 に答える
0

.ToList()DateTime フィルタリングの前に呼び出すことで、これを回避しました。これにより、すべてが .NET に取り込まれるため、そこでクエリを実行できます。

私のデータベースには比較的少数のアイテムしかないので、これは問題ではありませんでした。

于 2013-01-09T14:00:07.610 に答える
0

MinTime.Value.Hour などは、クエリで実行する必要がある場合があり、.Net メモリで実行しているように思えます。そのため、エラーが発生します。

エンティティへの LINQ: http://msdn.microsoft.com/en-us/library/bb386964.aspx

于 2013-01-08T08:58:36.800 に答える