集計SQLを使用した左結合をLINQクエリとして最もエレガントに表現するにはどうすればよいですか?質問する

集計SQLを使用した左結合をLINQクエリとして最もエレガントに表現するにはどうすればよいですか?質問する

SQL:

SELECT
   u.id,
   u.name,
   isnull(MAX(h.dateCol), '1900-01-01') dateColWithDefault
FROM universe u
LEFT JOIN history h 
   ON u.id=h.id 
   AND h.dateCol<GETDATE()-1
GROUP BY u.Id, u.name

ベストアンサー1

解決策としては、null 値の処理をコードに委ねることになりますが、次のようになります。

DateTime 昨日 = DateTime.Now.Date.AddDays(-1);

var collection=
    from u in db.Universe
    select new
    {
        u.id,
        u.name,
        MaxDate =(DateTime?)
       (
           from h in db.History
           where u.Id == h.Id
           && h.dateCol < yesterday
           select h.dateCol 
       ).Max()
    };

これによってまったく同じ SQL が生成されるわけではありませんが、同じ論理的な結果が提供されます。「複雑な」SQL クエリを LINQ に変換するのは、必ずしも簡単ではありません。

おすすめ記事