C# LINQ使用Max()选择一行

C# LINQ使用Max()选择一行,c#,.net,linq,C#,.net,Linq,我在从NHibernate返回的IQueryable上使用LINQ,我需要在几个字段中选择具有最大值的行 我已经简化了我要坚持的部分。我需要从表中选择一个字段中具有最大值的行 var table=newtable{新行(id:1,状态:10),新行(id:2,状态:20)} 从表中的u开始 将u按1分组为g 其中u.Status==g.Max(u=>u.Status) 选择u 这是不正确的,但我无法写出正确的表格 顺便说一句,我实际上想要实现的是: var clientAddress=this

我在从NHibernate返回的IQueryable上使用LINQ,我需要在几个字段中选择具有最大值的行

我已经简化了我要坚持的部分。我需要从表中选择一个字段中具有最大值的行

var table=newtable{新行(id:1,状态:10),新行(id:2,状态:20)}
从表中的u开始
将u按1分组为g
其中u.Status==g.Max(u=>u.Status)
选择u
这是不正确的,但我无法写出正确的表格

顺便说一句,我实际上想要实现的是:

var clientAddress=this.repository.GetAll()
.GroupBy(a=>a)
.SelectMany(
g=>
g、 在哪里(
a=>
a、 Reference==clientReference&&
a、 Status==ClientStatus.Live&&
a、 AddressReference==g.Max(x=>x.AddressReference)和
a、 StartDate==g.Max(x=>x.StartDate)))
.SingleOrDefault();
我从上面的lambda开始,但我一直在使用LINQPad来尝试并制定选择Max()的语法

更新

删除GroupBy是关键

var all=this.repository.GetAll();
var地址=全部
.在哪里(
a=>
a、 Reference==clientReference&&
a、 Status==ClientStatus.Live&&
a、 StartDate==all.Max(x=>x.StartDate)&&
a、 AddressReference==all.Max(x=>x.AddressReference))
.SingleOrDefault();

您可以按状态分组,并从最大的组中选择一行:

table.GroupBy(r => r.Status).OrderByDescending(g => g.Key).First().First();
第一个
first();第二个
First()
获取该组中的第一行。

如果状态始终为unqiue,您可以将第二个
First()
替换为
Single()

我不明白您为什么要在这里分组

试试这个:

var maxValue = table.Max(x => x.Status)
var result = table.First(x => x.Status == maxValue);
另一种只对
迭代一次的方法是:

var result = table.OrderByDescending(x => x.Status).First();
如果
表格
是一个
IEnumerable
,它不存在于内存中,或者是动态计算的,那么这将非常有用。

您还可以执行以下操作:

(from u in table
orderby u.Status descending
select u).Take(1);

针对第一个问题,如果需要按某些条件将多行分组,而另一列的值为max,则可以执行以下操作:

var query =
    from u1 in table
    join u2 in (
        from u in table
        group u by u.GroupId into g
        select new { GroupId = g.Key, MaxStatus = g.Max(x => x.Status) }
    ) on new { u1.GroupId, u1.Status } equals new { u2.GroupId, Status = u2.MaxStatus}
    select u1;

只需在一行中

var result = table.First(x => x.Status == table.Max(y => y.Status));
请注意,有两个操作。 内部操作用于查找最大值, 外部操作用于获取所需对象。

更多示例:

如下:

 qryAux = (from q in qryAux where
            q.OrdSeq == (from pp in Sessao.Query<NameTable>() where pp.FieldPk
            == q.FieldPk select pp.OrdSeq).Max() select q);

可能重复:@M.Babcock在这个问题上有一个很好的答案:有比这个好得多的…看一看。@Serge我同意这将是最好的,但我担心这个项目在添加新库方面有障碍。我取出了分组,发现我可以让它工作:
来自用户帐户中的用户u、 Status==User\u Accounts.Max(y=>y.Status)选择u
您还可以嵌套lambda语法:
表。首先(x=>x.Status==table.Max(x=>x.Status))
@LandonPoch:这不是一个好主意,因为这将计算最大N次,其中N是
表中的项数
@Daniel Hilgarth:好主意!实际上,这将计算表中每行的最大值。我的不好。在对已接受答案的评论中讨论了此方法,指出它是一个坏主意。这是一个坏主意,因为table.Max(y=>y.Status)将为表中的每个项调用一次,这远远不是最佳的。
 select t.*   from nametable t  where t.OrdSeq =
        (select max(t2.OrdSeq) from nametable t2 where t2.FieldPk= t.FieldPk)