156

Entity Frameworkでこのコードを使用すると、次のエラーが発生します。特定の日付のすべての行を取得する必要がありDateTimeStartます。この形式のデータ型はDataTypeです。2013-01-30 12:00:00.000

コード:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

エラー:

base {System.SystemException}={"指定されたタイプメンバー'Date'はLINQtoEntitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。"}

それを修正する方法はありますか?

4

11 に答える 11

301

DateTime.DateSQLに変換できません。EntityFunctions.TruncateTimeメソッドを使用して、日付部分を取得します。

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

更新:@shankbondがコメントで述べたように、Entity Framework 6EntityFunctionsは廃止されたため、 EntityFrameworkDbFunctionsに付属しているクラスを使用する必要があります。

于 2013-01-30T10:29:53.540 に答える
92

今使用する必要がありますDbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
于 2014-03-12T21:50:02.053 に答える
21

EntityFunctions廃止されました。DbFunctions代わりに使用することを検討してください。

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
于 2014-04-20T06:06:13.697 に答える
19

エンティティフレームワークでこの問題を解決するのに役立つソリューションを追加したいと思います。

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

お役に立てば幸いです。

于 2014-02-26T09:58:21.610 に答える
8

x.DateTimeStartとcurrentDateの両方に常にEntityFunctions.TruncateTime()を使用します。そのような :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
于 2013-06-13T17:32:34.080 に答える
7

単純なプロパティを使用するだけです。

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

アプリで将来の日付が不可能な場合は、> = x.DateTimeStart>=currentDateTime.Dateで十分です。

より複雑な日付比較がある場合は、Canonical関数 を確認し、EF6+ DB関数がある場合

より一般的に-問題を検索している人向けEFでサポートされているLinqメソッドは 、メモリベースリストでは機能するがEFでは機能しないlinqステートメントで同様の問題を説明できます。

于 2013-01-30T10:46:47.293 に答える
5

簡略化:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
于 2016-12-01T08:00:24.740 に答える
2

EF6を使用するには、次のコードを使用します。

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
于 2017-05-15T15:40:05.543 に答える
1

私は同じ問題を抱えていますEntity Framework 6.1.3

しかし、別のシナリオで。私のモデルプロパティはnull許容型ですDateTime

DateTime? CreatedDate { get; set; }

だから私はすべての記録をチェックするために今日の日付に問い合わせる必要があるので、これは私にとってうまくいくものです。つまり、適切なクエリを取得するには、両方のレコードを切り捨てる必要がありますDbContext

Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);
于 2020-08-25T04:01:29.750 に答える
0

別の解決策は次のとおりです。

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
于 2015-01-16T08:16:12.453 に答える
-2

私はこれと同じ問題に直面しましたが、これは実際には、Whereメソッド内の.Dateプロパティへの呼び出しの存在が原因であるようです。削除すると、エラーは消えます。比較演算子のいずれかの側で.Dateプロパティを呼び出すと、このエラーが発生することを考慮してください。このエラーを解決するには、Whereメソッドの外でWhereメソッドの前に.Dateプロパティを呼び出すだけで十分です。

于 2021-07-13T08:38:22.443 に答える