指定された型メンバー 'Date'はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみ


138

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'はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。"}

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


私はEF Core 2.1.1でx.DateTimeStart.Dateを使用できます
Kirsten Greed

回答:


271

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

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

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


1
私はあなたのバージョンを少し変更する必要があります。Where(x => EntityFunctions.TruncateTime(x.DateTimeStart)== currentDate.Date); あなたの思いを知らせてください
GibboK

1
私はちょうど参考のために、あなたが同意する場合、私は編集あなたの答えは.dateを追加している気にしないことを望む:-)あなたのサポートへの感謝が、私は本当に感謝
GibboK

1
@GibboK確かに、問題ありません:)これは長い文字列をフォーマットするためだけのものでした。
Sergey Berezovskiy 2013年

68
EntityFunctionsは廃止されました。代わりにDbFunctions.TruncateTimeメソッドを使用してください
shankbond

1
指定された型メンバー 'Date'はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。
SAR

83

あなたは今使うべきです DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


指定された型メンバー 'Date'はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。
SAR

17

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

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

お役に立てば幸いです。


15

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

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

8

常にEntityFunctions.TruncateTime()をx.DateTimeStartとcurrentDateの両方に使用します。といった :

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

5

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

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で十分です。

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

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


3

簡略化:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();


0

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

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.