2017-06-23 1 views
0

Eine Adresstabelle enthält 1 oder mehr Adressen pro Typ und Mitarbeiter. Jede Zeile hat ein Adressdatum, aber kein Enddatum. Ich muss ein Enddatum "vortäuschen", indem ich das Datum des Inkrafttretens der nächsten Adresse der Mitarbeiter verwende.Enddatum zum Aufzeichnen hinzufügen Das ist das Startdatum des nächsten Datensatzes (linq to sql)

Die Quelltabelle ist:

EFFDT  ADDRESS1   ADDRESS_TYPE EMPLID 
12/21/1999 7927 SW 31st Ave HOME   6 
4/15/2002 7070 Shady Lane HOME   6 
3/18/2014 1228 Hall   HOME   6 

Das Ergebnis sollte sein:

EFFDT  ADDRESS1   ADDRESS_TYPE EMPLID ENDDATE 
12/21/1999 7927 SW 31st Ave HOME   6  4/15/2002 
4/15/2002 7070 Shady Lane HOME   6  3/18/2014 
3/18/2014 1228 Hall   HOME   6  NULL 

My SQL funktioniert, aber es immer in Linq to SQL arbeiten war und Ausgabe. Ich bin mir nicht sicher, ob das SQL das beste ist, weil es Typ nicht berücksichtigt. Aber derzeit haben alle meine Daten nur Adressen vom Typ HOME. Ich möchte auch andere Typen berücksichtigen. Hier ist die SQL:

Select A.EFFDT, A.ADDRESS1, A.ADDRESS_TYPE, A.EMPLID, 
(SELECT MIN(EFFDT) 
    FROM dbo.PS_ADDRESSES 
    WHERE EFFDT > A.EFFDT AND EMPLID = A.EMPLID) as EndDate 
FROM dbo.PS_ADDRESSES A 
ORDER BY A.EMPLID 
+0

Sie sollten Ihren Versuch zeigen, ihn in Linq zu übersetzen, damit die Leute auf Ihre Fehler hinweisen und Ihre Fehler korrigieren können. – Mat

+0

Für den Typ müssen Sie nur den Vergleich "ADDRESS_TYPE = A.ADDRESS_TYPE" mit der WHERE-Klausel der Unterabfrage hinzufügen. – juharr

+0

Ja @Mat, aber ich fühlte, wo ich hinging mit der Lösung war zu weit weg, und würde dazu führen, dass die Frage von der Spur gehen. – Jazzy

Antwort

0

Die Übersetzung ist einfach, obwohl ich nicht versuchen, die LINQ zu optimieren (vielleicht eine Gruppe von effizienter wäre).

from a in dbo.PS_ADDRESSES 
orderby a.EMPLID 
select new { 
    a.EFFDT, a.ADDRESS, a.ADDRESS_TYPE, a.EMPLID, 
    EndDate = (from na in dbo.PS_ADDRESSES where na.EFFDT > a.EFFDT && na.ADDRESS_TYPE == a.ADDRESS_TYPE && na.EMPLID == a.EMPLID select na.EFFDT).Min() 

}

Bei der Übersetzung, übersetzen nur die Klauseln in LINQ Reihenfolge: from, where, [orderby], select und erkennen, dass MIN, MAX, DISTINCT und TOP als Postfix Funktionen getan. Die Autoren der LINQ-Verstehenssyntax haben entschieden, keine unären Lambda-Funktionen in die Syntax aufzunehmen. Es hilft, wenn die SQL bereits einen Tabellen-Alias ​​in der FROM LINQ-Syntax entspricht, aber Sie können immer eine hinzufügen (wie ich mit na getan habe).

Verwandte Themen