2017-04-18 13 views
0

Ich habe eine SQL-Server-CE 4-Datenbank mit einer Tabelle mit einer DateTime? Spalte namens EndDate. Wenn ich einen Datensatz lösche, setze ich dieses Enddatum und wenn ich eine Liste von Datensätzen abrufen möchte, möchte ich alle gelöschten Datensätze filtern, indem ich einen Filter auf das Enddatum anwende.Was ist der einfachste Weg, um DateTime in Linq mit SQL Server CE zu vergleichen?

Ich wenden diesen Filter über LINQ mit Entity Framework.

Meine Linq-Abfrage sieht wie folgt aus:

protected IDbSet<TEntity> Entities; 
... 
Entities.AsNoTracking().AsQueryable() 
    .Where(entity => !entity.EndDate.HasValue || entity.EndDate.Value > DateTime.UtcNow); 

Wenn ich diese Linq-Abfrage ich die folgende Fehlermeldung aus:

The function 'CurrentUtcDateTime' is not supported by SQL Server Compact.

zu diesem Fehler Searching sagt mir, dass (wenn ich es verstanden habe richtig) Ich kann DateTime.UtcNow nicht verwenden.

Meine Frage ist: Was ist der alternative Weg, um das Ziel zu erreichen, das ich versuche zu erreichen?

Gibt es eine andere Funktion, die ich über Linq verwenden kann? Oder sollte ich eine primitivere Lösung verwenden, bei der ich auch die Datetime in eine Epoche umwandele und diese vergleiche?

+1

Haben Sie versucht 'var now = DateTime.UtcNow;' und dann '... entity.EndDate.Value> jetzt);'? – Igor

+0

entity.EndDate.Value.ComparetTo (otherDate) lookup CompareTo – kblau

+0

Danke Igor, das hat den Trick gemacht. Ich dachte, ich hätte das versucht, aber ich denke, ich habe es nicht getan. Ich frage mich immer noch, warum eine Var akzeptiert wird und eine Eigenschaft nicht? Irgendwelche Ideen? – Cornelis

Antwort

0

Das Problem ist, dass das Codebeispiel Betrieb für den Betrieb nicht lokal ist, weil es IQueryable Zustand ist, was bedeutet, hat es noch nicht und machte in konkrete Daten ausgeführt worden ist der Prozess verwenden kann. Dies ermöglicht, dass die Abfrage bei Bedarf durch andere Operationen wie eine andere Where-Klausel angepasst wird.

Sobald die Daten tatsächlich abgefragt werden, erstellt Linq SQL, um diesen Job auszuführen und an die Datenbank gesendet zu werden, und SQL kann nicht bestimmen, was UTC.Now ist.

Eine Client-Option ist es, die Daten zu konkretisieren, indem sie sie nach unten zu bringen und das Filtern sie dann aus wie:

Entities.AsNoTracking().ToList() 
         .Where(entity => !entity.EndDate.HasValue 
              || entity.EndDate.Value > DateTime.UtcNow); 

die über arbeiten die ToList die Daten availble auf die Laufzeit zu machen. Die Kosten senken natürlich alle zu filternden Werte im Client. Wenn das klein ist, ist es in Ordnung, wenn es Tausende von Aufzeichnungen gibt; Nicht empfohlen.


Andernfalls werden die Datenbankoptionen sind eine gespeicherte Prozedur zu erstellen, um die erforderlichen Aufzeichnungen, um zu Fall zu bringen, oder eine berechnete Spalte Feld hinzufügen, die einen Booleschen für den Test zurückgibt (s) benötigt.

Verwandte Themen