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?
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);
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: EntityFunctions
ist veraltet in EF6, Use DbFunctions.TruncateTime
Verwenden Sie für EF6 stattdessen DbFunctions.TruncateTime (mydate).
"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.
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
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.
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
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);
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();