web-dev-qa-db-ja.com

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

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} = {"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}

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

122
GibboK

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

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

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

239

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

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

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

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

私はそれが役立つことを願っています。

13
jvrdelafuente

EntityFunctionsは廃止されました。代わりにDbFunctionsの使用を検討してください。

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

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

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

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

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ステートメントに関する同様の問題を説明できます。

4
phil soady

簡体字:

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

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

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
1

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

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
0
CalinCosmin