如何使用聚合SQL作为LINQ查询最优雅地表达左连接

vzczc 18 c# linq left-join

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

vzczc.. 8

解决方案,尽管将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并不总是直截了当的.