Ich habe bei der Implementierung der folgenden Anweisungen eine Ausnahme erhalten.
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?
.Date
.Antworten:
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 dann einen Wert zu übergeben. Es sieht so aus, als ob Convert.ToDateTime (rule.data) .Date den Fehler verursacht.
Das Aufrufen von Date für eine DateTime-Eigenschaft kann ebenfalls 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.
quelle
j.JobDeadline.Date
?Sie können die TruncateTime- Methode der EntityFunctions verwenden , um eine korrekte Übersetzung der
Date
Eigenschaft in SQL zu erzielen :Update:
EntityFunctions
ist in EF6, Verwendung veraltetDbFunctions.TruncateTime
quelle
ruleData
dasDateTime
Typ ist undj.JobDeadline
die Zeit verkürzt hat. Fühlt sich nicht richtig an. Keine Ausnahme, aber auch kein erwartetes Ergebnis.JobDeadline
das gleiche Datum wie angezeigt wirdrule.data
, unabhängig von der Tageszeit . Ist es nicht das, was Sie mit Ihrer Anfrage in der Frage erreichen wollen? Warum fühlt es sich nicht richtig an?EntityFunctions
in EF6 veraltet ist und Sie es jetzt verwenden solltenDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxVerwenden Sie für EF6 stattdessen DbFunctions.TruncateTime (mydate).
quelle
"EntityFunctions.TruncateTime" oder "DbFunctions.TruncateTime" in ef6 funktioniert, es gibt jedoch einige Leistungsprobleme in Big Data.
Ich denke, der beste Weg ist, so zu handeln:
Es ist besser, als Teile des Datums zu verwenden. weil die Abfrage in großen Datenmengen schneller ausgeführt wird.
quelle
EntityFunctions.TruncateTime
(später ersetzt durchDbFunctions.TruncateTime
) werden durch Konvertieren in SQL implementiert, wobei die datetime in eine Zeichenfolge konvertiert und diese abgeschnitten wird. Dadurch wird die Abfrage im Verhältnis zur Anzahl der verarbeiteten Datensätze erheblich langsamer ausgeführt.Müssen enthalten
using System.Data.Entity;
. Funktioniert auch gut mitProjectTo<>
quelle
Dies bedeutet, dass LINQ to SQL nicht weiß, wie die
Date
Eigenschaft in einen SQL-Ausdruck umgewandelt werden kann. Dies liegt daran, dass dieDate
Eigenschaft derDateTime
Struktur in SQL kein Analogon hat.quelle
Es hat bei mir funktioniert.
Quelle: Asp.net-Foren
quelle
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, als wäre es eine Zeitspanne.
Sie können dies auch mit DateTime-Range tun:
quelle
Sie können Enum wie folgt bekommen:
quelle
Wie viele hier bereits betont haben, ist die Verwendung der TruncateTime-Funktion langsam.
Die einfachste Option, wenn Sie können, ist die Verwendung von EF Core. Das kann es. Wenn Sie dies nicht können, besteht eine bessere Alternative zum Abschneiden darin, das abgefragte Feld überhaupt nicht zu ändern, sondern die Grenzen zu ändern. Wenn Sie eine normale Abfrage vom Typ "Zwischen" ausführen, bei der die Unter- und Obergrenze optional sind, reicht Folgendes aus.
Anstatt PoDate auf den Datumsteil zurückzuschneiden, erhöhen wir grundsätzlich die obere Abfragegrenze und den Benutzer <anstelle von <=
quelle