要做到这一点必须有一个单行,而我却找不到它。
鉴于此查询:
from x in new XPQuery<XPContent>(s)
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }
我需要为每个不同的ContentID选择具有最大日期的记录。使用LINQ可以巧妙地完成这项工作吗?现在我正在这样做:
var q = (from x in new XPQuery<XPContent>(s)
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }).ToList();
var r = q.ToLookup(item => item.ContentID);
foreach (var rItem in r) {
var s = rItem.OrderByDescending(a => a.Date).First();
/* do stuff with s */
}
......但ToLookup感觉有点笨重。或者我有最好的(最简单的)解决方案吗?
另外,我知道我不应该使用ToList,但请暂时忽略它。
提前致谢!
答案 0 :(得分:6)
我想你想要:
var q = from x in new XPQuery<XPContent>(s)
group x by x.ContentID into g
let latest = g.OrderByDescending(a => a.Date).First()
select new
{
latest.Category, latest.ContentType,
latest.Name, latest.ContentID, latest.Date
};
(请注意,有更多高效的方法可以从组中查找'maximum'元素,而不是先对其进行排序,例如使用MaxBy
运算符。)
查询非常简单;它只是按ContentId
对项目进行分组,然后从每个组中选择一个匿名类型的实例,该实例是从该组的最新项目生成的。