次のステートメントの実装中に例外が発生しました。
DateTime result;
if (!DateTime.TryParse(rule.data, out result))
return jobdescriptions;
if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
例外
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
私は例外の意味を知っていますが、それを取り除く方法がわかりません。何か助け?
LINQ to Entitiesは、同等のSQLがないため、ほとんどの.NET Dateメソッド(使用したキャストを含む)をSQLに変換できません。
解決策は、LINQステートメントの外部でDateメソッドを使用し、値を渡すことです。 Convert.ToDateTime(rule.data).Dateがエラーを引き起こしているように見えます。
DateTimeプロパティでDateを呼び出すこともSQLに変換できないため、回避策は、整数であるためLINQに変換できる.Year .Monthおよび.Dayプロパティを比較することです。
var ruleDate = Convert.ToDateTime(rule.data).Date;
return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year
&& j.Deadline.Month == ruleDate.Month
&& j.Deadline.Day == ruleDate.Day);
TruncateTime メソッドを使用できます EntityFunctionsDate
プロパティのSQLへの正しい変換を実現するには:
using System.Data.Objects; // you need this namespace for EntityFunctions
// ...
DateTime ruleData = Convert.ToDateTime(rule.data).Date;
return jobdescriptions
.Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData);
更新:EntityFunctions
はEF6で非推奨、DbFunctions.TruncateTime
を使用
EF6の場合は、代わりにDbFunctions.TruncateTime(mydate)を使用します。
ef6の「EntityFunctions.TruncateTime」または「DbFunctions.TruncateTime」は機能していますが、ビッグデータでパフォーマンスの問題があります。
最善の方法は次のように行動することだと思います。
DateTime ruleDate = Convert.ToDateTime(rule.data);
DateTime startDate = SearchDate.Date;
DateTime endDate = SearchDate.Date.AddDay(1);
return jobdescriptions.Where(j.Deadline >= startDate
&& j.Deadline < endDate );
日付の一部を使用するよりも優れています。大規模なデータではクエリが高速に実行されるためです。
使用してみてください
return jobdescriptions.AsEnumerable()
.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
AsEnumerable()
は、クエリのコンテキストをLINQからEntitiesに、LINQ to Objectsに切り替えるため、条件はSQLに変換されません
つまり、LINQ to SQLはDate
プロパティをSQL式に変換する方法を知らないということです。これは、Date
構造体のDateTime
プロパティがSQLに類似していないためです。
それは私のために働いた。
DateTime dt = DateTime.Now.Date;
var ord = db.Orders.Where
(p => p.UserID == User && p.ValidityExpiry <= dt);
ソース: Asp.net Forums
私も同じ問題を抱えていますが、DateTime-Rangesを使用しています。私の解決策は、開始時刻(任意の日付)を00:00:00に、終了時刻を23:59:59に操作することです。したがって、DateTimeをDateに変換する必要はなく、DateTimeのままにします。
DateTimeが1つしかない場合は、開始時刻(任意の日付を含む)を00:00:00に設定し、終了時刻を23:59:59に設定することもできます。その後、時間範囲であるかのように検索します。
var from = this.setStartTime(yourDateTime);
var to = this.setEndTime(yourDateTime);
yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);
DateTime-Rangeでもできます:
var from = this.setStartTime(yourStartDateTime);
var to = this.setEndTime(yourEndDateTime);
yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);
次のようなEnumを取得できます。
DateTime todayDate = DateTime.Now.Date; var check = db.tableName.AsEnumerable().Select(x => new
{
Date = x.TodayDate.Date
}).Where(x => x.Date == todayDate).FirstOrDefault();