Meine Tabelle hat eine Timestamp-Spalte mit dem Namen "RowVer", die von LINQ auf System.Data.Linq.Binary abgebildet wird. Dieser Datentyp scheint mir nutzlos, weil ich (wenn ich etwas nicht verpasse) solche Dinge nicht tun kann:
%Vor%Also, eine der Lösungen, die ich mir vorgenommen habe, ist das Hinzufügen einer neuen "berechneten Spalte" namens RowTrack, die in SQL wie folgt definiert ist:
%Vor%Dadurch kann ich die Datenbank wie gewünscht abfragen:
%Vor%Ist das ein schlechter Weg, Dinge zu tun? Wie performant wird eine berechnete Spalte abgefragt? Gibt es eine bessere Work-around?
Ich entwickle auch gegen Sql Server 2000, um ultimative Abwärtskompatibilität zu erreichen, aber ich kann den Boss dazu bringen, 2005 zum kleinsten gemeinsamen Nenner zu machen.
// Wählen Sie alle Datensätze aus, die seit dem letzten Einfügen geändert / aktualisiert wurden.
Gibt es einen besseren Work-Around?
Warum nicht zwei Spalten haben, eine für createddate eine andere für lastmodifieddate. Ich würde sagen, dass dies ein traditionellerer Weg ist, um mit diesem Szenario umzugehen.
AS Diego Frata skizziert in Dieser Beitrag Es gibt einen Hack, der es ermöglicht, Zeitstempel von LINQ abfragbar zu machen.
Der Trick besteht darin, eine Methode Vergleichen zu definieren, die zwei System.Data.Linq.Binary -Parameter
akzeptiert %Vor%Beachten Sie, dass die Funktion nicht implementiert werden muss, nur ihr Name ( Vergleichen ) ist wichtig.
Und die Abfrage sieht ungefähr so aus:
%Vor%(Dies ist im Falle von job.TimeStamp & gt; lastTimestamp)
BEARBEITEN : Siehe Rory MacLeods Antwort für eine Implementierung der Methode, wenn sie außerhalb von SQL benötigt wird.
Der SQL Server "timestamp" ist nur ein Indikator dafür, dass sich der Datensatz geändert hat, es ist nicht wirklich eine Darstellung von Datum / Uhrzeit. (Obwohl jedes Mal, wenn ein Datensatz in der Datenbank geändert wird, eine Erhöhung erforderlich ist,
Achten Sie darauf, dass es auf Null zurückgeht (nicht sehr oft, zugegebenermaßen), daher ist der einzige sichere Test, ob sich der Wert geändert hat, nicht wenn er größer ist als irgendein beliebiger vorheriger Wert.
Sie könnten den TimeStamp-Spaltenwert an ein Webformular übergeben und dann beim Senden sehen, ob der Zeitstempel des Formulars sich von dem Wert im aktuellen Datensatz unterscheidet. Wenn es anders ist, hat jemand anderes & amp; speicherte den Datensatz in der Zwischenzeit.
Im Anschluss an die Antwort von jaraics können Sie auch eine Implementierung für die Methode Compare
bereitstellen, die dies zulässt außerhalb einer Abfrage arbeiten:
Die Verwendung von memcmp
wurde aus diese Antwort übernommen auf eine Frage zum Vergleich von Byte-Arrays. Wenn die Arrays nicht die gleiche Länge haben, aber das längere Array mit den gleichen Bytes wie das kürzere Array beginnt, wird das längere Array als größer betrachtet als das kürzere, selbst wenn die zusätzlichen Bytes nur Nullen sind.
Tags und Links sql-server linq performance