C# 为每个ID选择具有最大日期的值
这是“历史”表 如何使用linq为每个id选择最大值C# 为每个ID选择具有最大日期的值,c#,linq,C#,Linq,这是“历史”表 如何使用linq为每个id选择最大值 context.History .GroupBy(x=>x.id)?? 。仅选择WithMax(z=>z.date)?? 结果只有两个对象 id value date 1 3 03/01/2017 20:20:20 2 6 02/01/2017 20:20:20 我建议使用的MaxBy函数,即: context.History.GroupBy( x => x.id ).Select( x => x.Max
context.History
.GroupBy(x=>x.id)??
。仅选择WithMax(z=>z.date)??
结果只有两个对象
id value date
1 3 03/01/2017 20:20:20
2 6 02/01/2017 20:20:20
我建议使用的MaxBy
函数,即:
context.History.GroupBy( x => x.id ).Select( x => x.MaxBy( y => y.date) )
如果希望整行中的每个
Id
都具有最高日期,可以使用以下代码(使用LinqPad编写)。如果您只需要Id
,您可以使用@BurnsBA的答案,因为它会稍微更有效
void Main()
{
var data = new List<Record>
{
new Record(){Id=1, Value=1, Date=new DateTime(2017,1,1)},
new Record(){Id=1, Value=2, Date=new DateTime(2017,2,1)},
new Record(){Id=1, Value=3, Date=new DateTime(2017,3,1)},
new Record(){Id=2, Value=5, Date=new DateTime(2017,1,1)},
new Record(){Id=2, Value=6, Date=new DateTime(2017,2,1)},
};
var query = data.GroupBy(d => d.Id)
.SelectMany(g => g.OrderByDescending(d => d.Date)
.Take(1));
query.Dump();
}
public class Record
{
public int Id { get; set; }
public int Value { get; set; }
public DateTime Date { get; set; }
}
void Main()
{
var数据=新列表
{
新记录(){Id=1,Value=1,Date=new DateTime(2017,1,1)},
新记录(){Id=1,Value=2,Date=new DateTime(2017,2,1)},
新记录(){Id=1,Value=3,Date=new DateTime(2017,3,1)},
新记录(){Id=2,Value=5,Date=new DateTime(2017,1,1)},
新记录(){Id=2,Value=6,Date=new DateTime(2017,2,1)},
};
var query=data.GroupBy(d=>d.Id)
.SelectMany(g=>g.OrderByDescending(d=>d.Date)
.采取(1)项措施;
query.Dump();
}
公开课记录
{
公共int Id{get;set;}
公共int值{get;set;}
公共日期时间日期{get;set;}
}
结果:
首先,它按Id
分组,然后按Date
降序排列组内的项目,并返回第一个项目,SelectMany
,然后将列表展平。公共类历史记录
{
公共int id{get;set;}
公共int值{get;set;}
公共日期时间日期{get;set;}
}
//设置:
var值=新列表();
Add(newhistory(){id=1,value=1,date=DateTime.Parse(“01/01/2017 20:20:20”)});
Add(newhistory(){id=1,value=2,date=DateTime.Parse(“02/01/2017 20:20:20”)});
Add(newhistory(){id=1,value=3,date=DateTime.Parse(“03/01/2017 20:20:20”)});
Add(newhistory(){id=2,value=5,date=DateTime.Parse(“01/01/2017 20:20:20”)});
Add(newhistory(){id=2,value=6,date=DateTime.Parse(“02/01/2017 20:20:20”)});
//结果:
GroupBy.values(
x=>x.id,
y=>y.date,
//在下面,日期将是可枚举的
(id,dates)=>new{id=id,date=dates.Max()}
)
//返回匿名类型的可枚举集合:
{
{id=1,日期=[2017年3月1日下午8:20:20]},
{id=2,date=[2/1/2017 8:20:20 PM]}
}
请显示您尝试过的内容,可以从GroupBy
开始…您想要什么结果,Id
,值
,或者具有最高日期的整行?另外,您需要实体框架吗?如果是这样,它可能会限制一些可能的答案。这个实体框架兼容吗?这个问题没有用EF标记,但从他们通过名为context
的变量进行查询的方式以及他们提到“表”的事实来看,我认为他们需要支持实体框架的东西。根据对源代码的快速扫描,它可能不是。
void Main()
{
var data = new List<Record>
{
new Record(){Id=1, Value=1, Date=new DateTime(2017,1,1)},
new Record(){Id=1, Value=2, Date=new DateTime(2017,2,1)},
new Record(){Id=1, Value=3, Date=new DateTime(2017,3,1)},
new Record(){Id=2, Value=5, Date=new DateTime(2017,1,1)},
new Record(){Id=2, Value=6, Date=new DateTime(2017,2,1)},
};
var query = data.GroupBy(d => d.Id)
.SelectMany(g => g.OrderByDescending(d => d.Date)
.Take(1));
query.Dump();
}
public class Record
{
public int Id { get; set; }
public int Value { get; set; }
public DateTime Date { get; set; }
}