111

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

 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.

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

4

9 に答える 9

240

EntityFunctionsのTruncateTimeメソッドを使用して、プロパティを SQLに正しく変換できます。Date

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

于 2012-07-22T13:40:36.227 に答える
105

LINQ to Entities は、同等の SQL がないため、ほとんどの .NET Date メソッド (使用したキャストを含む) を SQL に変換できません。

解決策は、LINQ ステートメントの外部で Date メソッドを使用してから、値を渡すことです。Convert.ToDateTime(rule.data).Date がエラーを引き起こしているようです。

DateTime プロパティでの Date の呼び出しも SQL に変換できないため、.Year .Month および .Day プロパティを比較して回避します。これらは整数のみであるため、LINQ に変換できます。

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);
于 2012-07-22T03:22:50.523 に答える
39

EF6 の場合は、代わりに DbFunctions.TruncateTime(mydate) を使用してください。

于 2013-12-09T17:31:05.310 に答える
1

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

于 2012-07-22T02:31:05.990 に答える
0

ここで多くの人が指摘しているように、TruncateTime 関数の使用は遅いです。

可能であれば最も簡単なオプションは、EF Core を使用することです。これを行うことができます。それができない場合は、切り詰める代わりに、クエリされたフィールドをまったく変更せず、境界を変更することをお勧めします。下限と上限がオプションである通常の「between」タイプのクエリを実行している場合は、次の方法でうまくいきます。

    public Expression<Func<PurchaseOrder, bool>> GetDateFilter(DateTime? StartDate, DateTime? EndDate)
    {
        var dtMinDate = (StartDate ?? SqlDateTime.MinValue.Value).Date;
        var dtMaxDate = (EndDate == null || EndDate.Value == SqlDateTime.MaxValue.Value) ? SqlDateTime.MaxValue.Value : EndDate.Value.Date.AddDays(1);
        return x => x.PoDate != null && x.PoDate.Value >= dtMinDate && x.PoDate.Value < dtMaxDate;
    }

基本的に、PoDate を Date 部分だけに戻すのではなく、クエリの上限とユーザー < を <= ではなくインクリメントします。

于 2020-05-19T06:02:49.900 に答える
0

私は同じ問題を抱えていますが、DateTime-Ranges を使用しています。私の解決策は、開始時刻 (任意の日付) を 00:00:00 に、終了時刻を 23:59:59 に操作することです。そのため、DateTime を DateTime のままにする必要はありません。

DateTime が 1 つしかない場合は、start-time (任意の日付) を 00:00:00 に、end-time を 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);
于 2017-02-08T09:17:11.223 に答える