我觉得这很容易,但我真的很挣扎。
我有一个包含此架构的表:
名称,日期,价值
这是我想要实现的目标:
#1很容易通过GroupBy实现(“名称”,“它”) 但是,现在是什么......? 我如何查询分组结果???
谢谢大家。
答案 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);