您無法在給定的代碼中訪問Id b因爲你按照所有者進行分組,並且組的關鍵將是所有者而不是「交通」對象。
如果按流量組對象,你需要一些方法來告訴GROUPBY如何將它們正確(由所有者即組)比較,這可以用的IEqualityComparer
例如完成
private class Traffic {
public int Id { get; set; }
public string Owner { get; set; }
public DateTime CallTime { get; set; }
}
private class TrafficEquaityComparer : IEqualityComparer<Traffic> {
public bool Equals(Traffic x, Traffic y) {
return x.Owner == y.Owner;
}
public int GetHashCode(Traffic obj) {
return obj.Owner.GetHashCode();
}
}
private static TrafficEquaityComparer TrafficEqCmp = new TrafficEquaityComparer();
private Traffic[] src = new Traffic[]{
new Traffic{Id = 1, Owner = "A", CallTime = new DateTime(2012,1,1)}, // oldest
new Traffic{Id = 2, Owner = "A", CallTime = new DateTime(2012,2,1)},
new Traffic{Id = 3, Owner = "A", CallTime = new DateTime(2012,3,1)},
new Traffic{Id = 4, Owner = "B", CallTime = new DateTime(2011,3,1)},
new Traffic{Id = 5, Owner = "B", CallTime = new DateTime(2011,1,1)}, //oldest
new Traffic{Id = 6, Owner = "B", CallTime = new DateTime(2011,2,1)},
};
[TestMethod]
public void GetMinCalls() {
var results = src.GroupBy(ts => ts, TrafficEqCmp)
.Select(grp => {
var oldest = grp.OrderBy(g => g.CallTime).First();
return new { Id = oldest.Id,
Owner = grp.Key.Owner,
CallTime = oldest.CallTime };
}); }
這給
ID : Owner : MinCallTime
1 : A : (01/01/2012 00:00:00)
5 : B : (01/01/2011 00:00:00)
的結果。
您可以使用[MinBy(http://code.google.com/p/morelinq/source/browse/MoreLinq/MinBy.cs) – 2012-07-17 10:55:10
請問你傳統的SQL實例實際運行? – AakashM 2012-07-17 10:58:00
ANSI SQL不允許使用選擇列表中不屬於「group by」組成部分的列; MySQL允許這樣做(除非你在ANSI模式下運行它)。 – dasblinkenlight 2012-07-17 10:58:43