Linq组通过子查询

时间:2009-06-10 16:43:39

标签: c# sql linq

我有一个包含以下三个属性的对象: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)
};

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

鉴于您的最新解释,这是我提出的解决方案。我还清理了一些代码。

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;
}

我相信这应该是你现在想要的。让我知道它是否适合你。

答案 1 :(得分:2)

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);

答案 2 :(得分:1)

SELECT ID, MAX(DATE), NAME
FROM TABLE
GROUP BY ID

列'TABLE.NAME'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。