web-dev-qa-db-ja.com

指定された型メンバー 'Date'は、LINQ to Entities Exceptionではサポートされていません

次のステートメントの実装中に例外が発生しました。

 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.

私は例外の意味を知っていますが、それを取り除く方法がわかりません。何か助け?

99
nebula

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);
99
Judo

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を使用

217
Slauma

EF6の場合は、代わりにDbFunctions.TruncateTime(mydate)を使用します。

36

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 );

日付の一部を使用するよりも優れています。大規模なデータではクエリが高速に実行されるためです。

8
Mahdi Shahbazi

使用してみてください

return jobdescriptions.AsEnumerable()
.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );

AsEnumerable()は、クエリのコンテキストをLINQからEntitiesに、LINQ to Objectsに切り替えるため、条件はSQLに変換されません

2
Caleb Kiage

つまり、LINQ to SQLはDateプロパティをSQL式に変換する方法を知らないということです。これは、Date構造体のDateTimeプロパティがSQLに類似していないためです。

1
Adam Robinson

それは私のために働いた。

DateTime dt = DateTime.Now.Date;
var ord = db.Orders.Where
      (p => p.UserID == User && p.ValidityExpiry <= dt);

ソース: Asp.net Forums

1
M.R.T2017

私も同じ問題を抱えていますが、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);
0
peter70

次のようなEnumを取得できます。

DateTime todayDate = DateTime.Now.Date; var check = db.tableName.AsEnumerable().Select(x => new
        {
            Date = x.TodayDate.Date
        }).Where(x => x.Date == todayDate).FirstOrDefault();
0
Omid Soleiman