左外联结,GroupJoin的一段示例代码:
var data = keys.GroupJoin(
db.AggSp1Hours.
Where(o => o.ShowId == sid && o.TimeSlot >= dtMin && o.TimeSlot < dtMax).
GroupBy(o => new { o.Product.Name, o.TimeSlot }).
Select(o => new ReportItem { Key = new ReportKey() { Name = o.Key.Name ?? sName, dt = o.Key.TimeSlot }, Value = o.Sum(a => (double?)a.Amount ?? 0) }),
key => key,
agg => GetRefKey(keys, agg.Key),
(key, agg) => new ReportItem { Label = key.dt.ToString("HH:00"), Name = key.Name, Value = agg.Sum(a => a.Value) });
这个key=>key和agg=>key,从值上看是相等的,但是引用不同,因为在select new的时候不能把agg的key赋值为另一个引用对象。
结果在groupjoin的对比中,两个key就不想等不能进行期望的左外联结。即便重写key对象的Equals方法也不行。
无奈,便通过keys再找到与agg中的key对应的引用key来作为键与key=>key进行比对,就可以了。
感觉有些万恶啊。