linqとsqlの結果を同じにしたい
お世話になっております。以前に質問させていただいた内容と被るのですが、解決できていない箇所があるので再度投稿させて頂きます。
SQLと同じ結果を出したいのですが、linqでleftjoinした際に違う結果になります。
いろいろと調べてlinqを書いてみたのですが、なかなかうまく行きません。
どなたかご指摘いただけますでしょうか?よろしくお願いします。
テーブル定義
TMP1
ID int
START_DATE datetime
TOUROKU_NO int
CD string
SQL
SELECT
BB1.*,
CASE WHEN BB2.START_DATE is NULL THEN GETDATE() ELSE BB2.START_DATE END AS END_DATE
FROM TMP1 AS BB1
LEFT JOIN TMP1 AS BB2 ON (BB1.ID = BB2.ID AND BB1.TOUROKU_NO = BB2.TOUROKU_NO AND BB1.START_DATE < BB2.START_DATE
SQL結果
ID STARTDATE TOROKU_NO CD END_DATE
7 2010-06-30 00:00:00.000 1 03010, 2011-07-05 00:00:00.000
7 2010-06-30 00:00:00.000 1 03010, 2011-09-26 00:00:00.000
7 2010-06-30 00:00:00.000 1 03010, 2011-12-06 00:00:00.000
7 2010-06-30 00:00:00.000 2 02010, 2011-12-06 00:00:00.000
7 2010-06-30 00:00:00.000 3 10010, 2016-11-01 14:48:08.410
7 2010-06-30 00:00:00.000 4 04441, 2016-11-01 14:48:08.410
7 2011-07-05 00:00:00.000 1 09010, 2011-09-26 00:00:00.000
7 2011-07-05 00:00:00.000 1 09010, 2011-12-06 00:00:00.000
7 2011-09-26 00:00:00.000 1 10010, 2011-12-06 00:00:00.000
7 2011-12-06 00:00:00.000 1 09010, 2016-11-01 14:48:08.410
7 2011-12-06 00:00:00.000 2 04441, 2016-11-01 14:48:08.410
LINQ
var result =
from orig in TMP1
join alias in TMP1
on orig.ID equals alias.ID into g
from alias in g.DefaultIfEmpty()
where orig.TOUROKU_NO == alias.TOUROKU_NO && orig.START_DATE < alias.START_DATE
select new {
orig.ID,
orig.START_DATE ,
orig.TOUROKU_NO,
orig.CD,
END_DATE = (DBNull.Value.Equals(alias.START_DATE) ? (DateTime)orig.SERVERDATE : (DateTime)alias.START_DATE),
};
LINQ結果
ID STARTDATE TOROKU_NO CD END_DATE
7 2010/06/30 0:00:00 1 03010, 2011/07/05 0:00:00
7 2010/06/30 0:00:00 1 03010, 2011/09/26 0:00:00
7 2010/06/30 0:00:00 1 03010, 2011/12/06 0:00:00
7 2010/06/30 0:00:00 2 02010, 2011/12/06 0:00:00
7 2011/07/05 0:00:00 1 09010, 2011/09/26 0:00:00
7 2011/07/05 0:00:00 1 09010, 2011/12/06 0:00:00
7 2011/09/26 0:00:00 1 10010, 2011/12/06 0:00:00