トップ回答者
ソートするカラムに【null】が含まれる場合の扱いについて

質問
回答
-
すなおに、ソート条件に null 判定を加えればよいのではないですか?
using (var db = new DataContext2()) { db.Log = Console.Error; var query = from t2 in db.Table2 orderby t2.day == null, t2.day select new { t2.day, t2.id }; foreach (var row in query) Console.WriteLine("{0,10:yyyy/MM/dd}, {1}", row.day, row.id); Console.ReadKey(); } /* SELECT [t0].[day], [t0].[id] FROM [dbo].[Table2] AS [t0] ORDER BY (CASE WHEN [t0].[day] IS NULL THEN 1 ELSE 0 END), [t0].[day] 2010/03/03, 1 2011/01/01, 5 2011/04/10, 3 , 4 , 2 */
もしくはデフォルト値を与えるとか、
// 日付が NULL の場合は MaxValue にして最後にまとめる order by t2.day ?? DateTime.MaxValue, t2.id
- 回答としてマーク おおつの井上です。 2011年6月8日 6:28
-
orderby は指定された項目の順に並べます。
orderby t.Year, t.Month, t.Day;
とすると、t.Year でソート → t.Year が同じ場合 t.Month でソート → t.Month まで同じ場合 t.Day でソート なので、年月日順に並びます。ソート順序に bool を指定した場合、false → true の順に並びます。(これは、出力された SQL から、真を 1 偽を 0 として処理しているためであることがわかりますが、Linq2SQL に限らず、bool 型のソート順は false → true です。)
- 回答としてマーク おおつの井上です。 2011年6月8日 9:05
すべての返信
-
すなおに、ソート条件に null 判定を加えればよいのではないですか?
using (var db = new DataContext2()) { db.Log = Console.Error; var query = from t2 in db.Table2 orderby t2.day == null, t2.day select new { t2.day, t2.id }; foreach (var row in query) Console.WriteLine("{0,10:yyyy/MM/dd}, {1}", row.day, row.id); Console.ReadKey(); } /* SELECT [t0].[day], [t0].[id] FROM [dbo].[Table2] AS [t0] ORDER BY (CASE WHEN [t0].[day] IS NULL THEN 1 ELSE 0 END), [t0].[day] 2010/03/03, 1 2011/01/01, 5 2011/04/10, 3 , 4 , 2 */
もしくはデフォルト値を与えるとか、
// 日付が NULL の場合は MaxValue にして最後にまとめる order by t2.day ?? DateTime.MaxValue, t2.id
- 回答としてマーク おおつの井上です。 2011年6月8日 6:28
-
orderby は指定された項目の順に並べます。
orderby t.Year, t.Month, t.Day;
とすると、t.Year でソート → t.Year が同じ場合 t.Month でソート → t.Month まで同じ場合 t.Day でソート なので、年月日順に並びます。ソート順序に bool を指定した場合、false → true の順に並びます。(これは、出力された SQL から、真を 1 偽を 0 として処理しているためであることがわかりますが、Linq2SQL に限らず、bool 型のソート順は false → true です。)
- 回答としてマーク おおつの井上です。 2011年6月8日 9:05