[英]Linq group by with a sub query
我有一个包含以下三个属性的对象:ID,DATE和NAME,并希望使用linq查询它,产生的结果与下面的sql语句中编写的结果相同。
SELECT ID, MAX(DATE), NAME
FROM TABLE
GROUP BY ID
到目前为止,这是我对linq的了解:
var grouped = from a in table
group a by a.ID into g
select new fooObject()
{
DATE= g.Max(a => a.DATE),
NAME= g.Select(a => a.Name).ToString(),
ID= g.Select(a => a.ID)
};
在此先感谢您的帮助。
根据您的最新解释,这是我建议的解决方案。 我也整理了一下代码。
var grouped = from item in table
group item by item.Id into g
let itemMaxDate = g.MaxBy(i => i.Date)
select new FooObject()
{
Id = g.Key,
Name = itemMaxDate.Name,
Date = itemMaxDate.Date
};
然后,您需要定义MaxBy
扩展方法。 (不幸的是,LINQ确实包含一个内置的。)
public static TSource MaxBy<TSource, TResult>(this IEnumerable<TSource>
collection, Func<TSource, TResult> func)
{
var comparer = Comparer<TResult>.Default;
TSource maxItem = null;
foreach (var item in collection)
{
if (comparer.Compare(item, maxItem) > 0)
maxItem = item;
}
return maxItem;
}
我相信这应该是您现在想要的。 让我知道它是否对您有用。
var grouped = (from a in table
where a.Date == (from d in table where a.ID == d.ID select Date).Max()
select a).OrderBy(i => i.ID);
SELECT ID, MAX(DATE), NAME
FROM TABLE
GROUP BY ID
选择列表中的“ TABLE.NAME”列无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.