2017-06-23 13 views
0

アドレステーブルには、タイプと従業員ごとに1つ以上のアドレスがあります。各行には有効期限がありますが、終了日はありません。私は従業員の次の住所有効日を使用して終了日を「偽造」する必要があります。次のレコードの開始日である終了日を追加します(linqからsqlへ)

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 

私のSQLは動作しますが、LINQ to SQLの中で動作するようにそれを得ることはされていると問題ました:

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 

結果は次のようになります。

ソース表があります。タイプが考慮されていないため、SQLがベストであるかどうかはわかりません。しかし、現在、私のすべてのデータはホームタイプのアドレスしか持っていません。 Idは他のタイプのアカウントも好きです。私は、LINQを最適化しようとしませんでしたが(おそらく別にグループは、より効率的である)、

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

あなたは何が間違っているのかを指摘し、間違いを訂正できるように、Linqに翻訳しようとしてください。 – Mat

+0

タイプの場合、 'ADDRESS_TYPE = A.ADDRESS_TYPE'比較をサブクエリのwhere句に追加するだけです。 – juharr

+0

はい@Matですが、解決策がどこから離れすぎていたかが分かりすぎて、問題が発生する原因となります。 – Jazzy

答えて

0

翻訳は簡単です: はここにSQLです。

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() 

}

変換する場合、単にLINQのために節を翻訳:fromwhere、[orderby]、selectMINMAXDISTINCTTOPが後置関数として行われることを実現。 LINQの理解構文の作成者は、構文に単項ラムダ関数を含めないことにしました。 SQLにすでにFROMのテーブルエイリアスがLINQ構文と一致するようになっていても、(いつでも)追加することができます(naと同じように)。

関連する問題