webentwicklung-frage-antwort-db.com.de

Der angegebene Typ member 'Date' wird in LINQ to Entities Exception nicht unterstützt

Beim Implementieren der folgenden Anweisungen ist eine Ausnahme aufgetreten.

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

Ausnahme

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

Ich weiß, was die Ausnahme bedeutet, aber ich weiß nicht, wie ich sie loswerden soll. Irgendeine Hilfe?

99
nebula

LINQ to Entities kann die meisten .NET Date-Methoden (einschließlich des von Ihnen verwendeten Castings) nicht in SQL übersetzen, da es kein gleichwertiges SQL gibt.

Die Lösung besteht darin, die Date-Methoden außerhalb der LINQ-Anweisung zu verwenden und anschließend einen Wert einzugeben. Es sieht so aus, als ob Convert.ToDateTime (rule.data) .Date den Fehler verursacht.

Das Aufrufen von Date für eine DateTime-Eigenschaft kann auch nicht in SQL übersetzt werden. Daher besteht eine Problemumgehung darin, die Eigenschaften .Year .Month und .Day zu vergleichen, die in LINQ übersetzt werden können, da es sich nur um Ganzzahlen handelt.

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

Sie können die TruncateTime -Methode der EntityFunctions um eine korrekte Übersetzung der Eigenschaft Date in SQL zu erhalten:

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


Update: EntityFunctionsist veraltet in EF6, Use DbFunctions.TruncateTime

217
Slauma

Verwenden Sie für EF6 stattdessen DbFunctions.TruncateTime (mydate).

36

"EntityFunctions.TruncateTime" oder "DbFunctions.TruncateTime" in ef6 funktioniert, es gibt jedoch Leistungsprobleme bei Big Data.

Ich denke, der beste Weg ist, so zu handeln:

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

es ist besser als Teile des Datums zu verwenden. weil die Abfrage in großen Datenmengen schneller ausgeführt wird.

8
Mahdi Shahbazi

Versuchen Sie es mit

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

AsEnumerable() wechselt den Kontext der Abfrage von LINQ zu Entities zu LINQ zu Objects, sodass die Bedingung nicht in SQL konvertiert wird

2
Caleb Kiage

Dies bedeutet, dass LINQ to SQL nicht weiß, wie die Eigenschaft Date in einen SQL-Ausdruck umgewandelt wird. Dies liegt daran, dass die Eigenschaft Date der Struktur DateTime in SQL kein Analogon enthält.

1
Adam Robinson

Es hat bei mir funktioniert.

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

Quelle: Asp.net-Foren

1
M.R.T2017

Ich habe das gleiche Problem, arbeite aber mit DateTime-Ranges. Meine Lösung besteht darin, die Startzeit (mit einem beliebigen Datum) auf 00:00:00 und die Endzeit auf 23:59:59 zu ändern. Daher muss ich meine DateTime nicht mehr in Date konvertieren, sondern sie bleibt DateTime.

Wenn Sie nur eine DateTime haben, können Sie auch die Startzeit (mit einem beliebigen Datum) auf 00:00:00 und die Endzeit auf 23:59:59 einstellen. Dann suchen Sie so, als ob es eine Zeitspanne wäre.

var from = this.setStartTime(yourDateTime);
var to = this.setEndTime(yourDateTime);

yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);

Du kannst es auch mit DateTime-Range machen:

var from = this.setStartTime(yourStartDateTime);
var to = this.setEndTime(yourEndDateTime);

yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);
0
peter70

sie können Enum wie folgt erhalten:

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