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."}
それを修正する方法はありますか?
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
クラスを使用する必要があります。
DbFunctions.TruncateTime
を使用する必要があります
var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
エンティティフレームワークでこの問題を解決するのに役立つソリューションを追加したいと思います。
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => x.DateTimeStart.Year == currentDateTime.Year &&
x.DateTimeStart.Month== currentDateTime.Month &&
x.DateTimeStart.Day == currentDateTime.Day
);
私はそれが役立つことを願っています。
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));
単純なプロパティを使用するだけです。
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ステートメントに関する同様の問題を説明できます。
簡体字:
DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
EF6を使用するには、以下のコードを使用します。
(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
別の解決策は次のとおりです。
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
.Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();