In meiner Anwendung verwende ich Entity Framework.
Mein Tisch
-Article
-period
-startDate
Ich brauche Datensätze, die übereinstimmen => DateTime.Now > startDate and (startDate + period) > DateTime.Now
Ich habe diesen Code ausprobiert, aber er funktioniert jetzt
Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
Wenn ich meinen Code ausführe, tritt die folgende Ausnahme auf
LINQ to Entities erkennt die Methode 'System.DateTime AddDays (Double)' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.
c#
linq
entity-framework
datetime
Yucel
quelle
quelle
period
?AddDays
ist die falsche Funktion, wenn es eine istdouble
.Antworten:
Bei Verwendung von LINQ to Entity Framework werden Ihre Prädikate in der Where-Klausel in SQL übersetzt. Sie erhalten diesen Fehler, weil es keine
DateTime.Add()
sinnvolle Übersetzung in SQL gibt.Eine schnelle Lösung besteht darin, die Ergebnisse der ersten Where-Anweisung in den Speicher zu lesen und dann LINQ to Objects zu verwenden, um die Filterung abzuschließen:
Sie können auch die EntityFunctions.AddDays- Methode ausprobieren , wenn Sie .NET 4.0 verwenden:
Hinweis:
EF 6
Es ist jetztSystem.Data.Entity.DbFunctions.AddDays
.quelle
Ich denke, dies ist das, was diese letzte Antwort vorschlagen wollte, aber anstatt zu versuchen, p.startdat Tage hinzuzufügen (etwas, das nicht in eine SQL-Anweisung konvertiert werden kann), warum nicht etwas tun, das mit SQL gleichgesetzt werden kann:
quelle
EntityFunctions
Lösung. Hier wird der zweite Operand nicht von einer anderen Entität in der Abfrage abgerufen und kann vor der Abfrage berechnet werden. Wenn beide Operanden in db gefunden würden, wäre dieEntityFunctions
Lösung immer noch geeignet, während die Lösung dieser Antwort nicht mehr funktionieren würde.Wie wäre es, wenn Sie 2 Tage von DateTime abziehen. Jetzt:
Um ehrlich zu sein, bin ich mir nicht sicher, was Sie erreichen wollen, aber das könnte funktionieren
quelle
Wenn Sie möchten, dass Ihr Ausdruck in SQL übersetzt wird, können Sie versuchen, ihn zu verwenden
System.Data.Entity.Core.Objects.AddDays-Methode.
Eigentlich ist veraltet markiert, aber es funktioniert. Es sollte durch System.Data.Entity.DbFunctions.AddDays ersetzt werden, aber ich kann es nicht finden ...
quelle