C# 为每个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

这是“历史”表

如何使用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.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; }
}