c#Dynamic.Linq - groupby然后按条件选择

时间:2011-01-09 10:10:15

标签: c# linq


我觉得这很容易,但我真的很挣扎。

我有一个包含此架构的表:
名称,日期,价值

这是我想要实现的目标:

  1. 按“名称”
  2. 对所有行进行分组
  3. 从该组中选择'Date',即'Date' 最大
  4. #1很容易通过GroupBy实现(“名称”,“它”) 但是,现在是什么......? 我如何查询分组结果???

    谢谢大家。

3 个答案:

答案 0 :(得分:2)

我从你的问题中做出的一个假设是“日期是最大的”,你的意思是最新的一个。

var data = new List<Data>
                             {
                                 new Data() {Name = "one3", Date = new DateTime(2001, 11, 11), Value = 7},
                                 new Data() {Name = "one2", Date = new DateTime(2001, 11, 11), Value = 111},
                                 new Data() {Name = "one2", Date = new DateTime(2011, 11, 11), Value = 7},
                             };

var result = data.GroupBy(x => x.Name).Select(grouping => grouping.OrderByDescending(x => x.Date).Take(1).FirstOrDefault()).ToList();

我确信可能有更好的方法来进行linq查询,但我希望这至少可以指出你正确的方向: - )

答案 1 :(得分:2)

我假设,对于每个名称,您需要具有该名称的最新日期的记录的值。如果这是正确的,那么以下内容应该可以正常工作

from d in new[]
{
    new { Name = "x", Date = new DateTime(2000, 1, 1), Value = 1, },
    new { Name = "x", Date = new DateTime(2001, 1, 1), Value = 2, },
    new { Name = "y", Date = new DateTime(2000, 1, 1), Value = 3, },
}
    group d by d.Name into g
    let maxDate = g.Max(d => d.Date)
    select new { Name = g.Key, Date = maxDate, Value = g.Single(p => p.Date == maxDate).Value }

我已将结果中的日期包括在内,以防它也是必需的。

答案 2 :(得分:0)

请参阅
http://www.albahari.com/nutshell/predicatebuilder.aspx

http://tomasp.net/blog/dynamic-linq-queries.aspx


更新

试试这个。这似乎对我有用:
我正在使用另一个答案的数据。希望这不是作弊...

var set = new[]
              {
                  new {Name = "x", Date = new DateTime(2000, 1, 1), Value = 1,},
                  new {Name = "x", Date = new DateTime(2001, 1, 1), Value = 2,},
                  new {Name = "y", Date = new DateTime(2000, 1, 1), Value = 3,},
              };

var query =
    from x in set
    orderby x.Date descending
    group x by x.Name
    into g
    select g.First();

Console.WriteLine(query.First().Date);