Estoy usando LINQ en un IQueryable devuelto por NHibernate y necesito seleccionar la fila con los valores máximos en un par de campos.
He simplificado la parte en la que me quedo. Necesito seleccionar la fila de mi tabla con el valor máximo en un campo.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
Esto es incorrecto pero no puedo encontrar la forma correcta.
Por cierto, lo que en realidad estoy tratando de lograr es aproximadamente esto:
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
Comencé con la lambda anterior, pero he estado usando LINQPad para intentar resolver la sintaxis para seleccionar Max ().
ACTUALIZAR
Eliminar el GroupBy fue clave.
var all = this.repository.GetAll();
var address = all
.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.StartDate == all.Max(x => x.StartDate) &&
a.AddressReference == all.Max(x => x.AddressReference))
.SingleOrDefault();
Respuestas:
No veo por qué se está agrupando aquí.
Prueba esto:
Un enfoque alternativo que repetiría
table
solo una vez sería este:Esto es útil si
table
es unaIEnumerable<T>
que no está presente en la memoria o que se calcula sobre la marcha.fuente
from u in User_Accounts where u.Status == User_Accounts.Max(y => y.Status) select u
table.First(x => x.Status == table.Max(x => x.Status))
table
.También puedes hacer:
fuente
Puede agrupar por estado y seleccionar una fila del grupo más grande:
El primero
First()
obtiene el primer grupo (el conjunto de filas con el estado más grande); el segundoFirst()
obtiene la primera fila de ese grupo.Si el estado siempre es único, puede reemplazar el segundo
First()
conSingle()
.fuente
Abordando la primera pregunta, si necesita tomar varias filas agrupadas por ciertos criterios con la otra columna con valor máximo, puede hacer algo como esto:
fuente
Más un ejemplo:
Seguir:
Igual a:
fuente
Simplemente en una línea:
Observe que hay dos acciones. la acción interna es para encontrar el valor máximo, la acción externa es para obtener el objeto deseado.
fuente